2011-04-08 92 views
3

如何将此快速排序算法转换为3,5,7,9和11元素的分区?实现3元素分区的快速排序算法,

#include"stdafx.h" 
#include<iostream> 
using namespace std; 
#include <stdio.h> 
#include <stdlib.h> 
#define size 50 
void swap(int *x,int *y) 
{ 
int temp; 
temp = *x; 
*x = *y; 
*y = temp; 
} 

int partition(int i,int j) 
{ 
return((i+j) /2); 
} 

void quicksort(int list[],int m,int n) 
{ 
int key,i,j,k; 
if(m < n) 
{ 
k = partition(m,n); 
swap(&list[m],&list[k]); 
key = list[m]; 
i = m+1; 
j = n; 
while(i <= j) 
{ 
while((i <= n) && (list[i] <= key)) 
i++; 
while((j >= m) && (list[j] > key)) 
j--; 
if(i < j) 
swap(&list[i],&list[j]); 
} 

swap(&list[m],&list[j]); 
quicksort(list,m,j-1); 
quicksort(list,j+1,n); 
} 
} 
void printlist(int list[],int n) 
{ 
int i; 
for(i=0;i<n;i++) 
printf("%d\t",list[i]); 
} 

void main() 
{ 
int n,i; 
int list[size]; 


printf("How many numbers do you want to enter"); 
scanf("%d",&n); 
printf("Enter the numbers you want to sort"); 
for(i=0;i<n;i++) 
{ 
scanf("%d",&list[i]); 
} 


printf("The list before sorting is:\n"); 
printlist(list,n); 
quicksort(list,0,n-1); 
printf("The list after sorting using quicksort algorithm:\n"); 
printlist(list,n); 
system("pause"); 
} 
+4

请不要大叫。 – 2011-04-08 14:19:13

+0

快速排序中的分区阶段包括将要排序的序列元素重新排列到所选透视的左侧或右侧,具体取决于它们分别小于或大于透视。不过,不清楚“_x_分区”是什么意思。 – abeln 2011-04-08 14:59:50

+0

如果您在gregg的答案(和阅读)后仍有问题,请将它们添加到问题中(如果它们是相关的),或者创建一个新问题。 – 2011-04-08 15:00:57

回答

5

我认为你的C++老师只是有一个糟糕的措辞选择。 “3个元素的分区”几乎肯定意味着:通过选择第一个,中间和最后一个元素的中间值来选择主元素 - 这是最常用的编码技术,并且在数组已经排序后具有良好的属性。

推断该定义为5,7,9,11.

+1

我认为它不是可怜的措辞选择,但非常棘手。 – james 2011-04-08 18:02:14

+1

或者它可能是一匹马而不是斑马:http://www.google.com/search?client=safari&rls=zh-CN&q=partition+of+3+medians&ie=UTF-8&oe=UTF-8 – 2011-04-08 20:22:55

+0

啊,我有认为这个想法是分成4/6/8部分而不是两部分。 – 2011-04-09 01:07:53

0

分区是quicksort算法的重要组成部分。回顾the algorithm了解什么是分区。祝你好运。

+0

没错,但是您能否详细说明“_x_元素的分区”是什么? – abeln 2011-04-08 15:01:00

+0

是的,我知道什么时候枢轴得到了正确的位置分区发生。但是我不知道x元素的分区的含义。 – james 2011-04-08 15:17:16