用快速排序法不行的吧?void quicksort(element list[],int left,int right){ int pivot,i,j; element temp; if(left<right){ i=left;j=right+1; pivot=list[left].key; do{ do i++; while(list[i].key<pivot); do j--; while(list[j].key>pivot); if(i<j) swap(list[i],list[j],temp); }while(i<j); swap(list[left],list[j],temp); quicksort(list,left,j-1); quicksort(lsit,j+1,right); } }
下面是别人给我的:第一次比较a与b。 第二次比较c与d。这时有三种情况:一、两组数皆不等;二、一组数相等,另一组不等;三、两组数都相等。分别讨论:一、如果两组数皆不等,假定a>b,c>d,则比较b与c(这是第三次比较),又分三种情况:b>c,b=c,b<c。 1. 若b>c,则知a>b>c>d,此时比较e与c(第四次比较),若e>c,则e为中数,否则,c是中数(两数相等时,两者都是中数)。 2. 若b<c,则知已有两个数(d和b)小于c,因此,第四次可比较e与c,又有三种情况: a) 若e>c,则第五次比较a与c,此时,若a>c则c是中数(因为a和e都比c大,而b和d都比c小),若a=c则a和c都是中数,若a<c则需比较a与d(第六次比较),较大者即为中数,相等则都是中数。 b) 若e<c,则比较e与b(第五次比较),用其中较大者与d比较(第六次),三数(b、d和e)中最大者便是中数(如果有相等的情况参看上文) c) 若e=c,则比较a与e(第五次比较),若a大则e和c是中数,若e大则a是中数,若一样大则a、c、e都是中数。 3. 若b=c,则知a>b=c>d,故只需比较e与c(第五次比较),若一样大,则b、c、e都是中数,否则(无论e<c还是e>c)b、c都是中数。二、若有一组数相等(假定a>b,c=d),则比较b与c(第三次),分三种情况: 1. 若b>c,则知a>b>c=d,此时比较c和e,若e<c则c和d是中数,若e=c则c、d、e同为中数,若e>c则比较b与e(第四次),若不等,则较小者为中数,否则,同b、e同为中数。 2. 若b=c,则比较e与c(第四次),若相等,则b、c、d、e同为中数,否则b、c、d为中数。 3. 若b<c,则比较a与c(第四次),又三种情况: a)若a>c,则知a>c=d>b,此时比较e与c(第五次),若相等,则c、d、e同为中数,否则c、d为中数。 b)若a<c,则知c=d>a>b,则比较e与c(第五次),若相等,c、d、e同为中数,若e>c,则c、d为中数,若e<c,则需比较a与e(第六次),若相等,a、e同为中数,否则较大者为中数。 c)若a=c,则知a=c=d>b,比较e与c(第五次),若相等,a、c、d、e同为中数,否则,a、c、d为中数。三、若a=b,c=d,则比较a与c(第三次),分两种情况(a>c与a<c是类似的): 1. 若a=c,则a=b=c=d,只需比较e与a(第四次),若相等,则全为中数(五个数全等),否则,a、b、c、d为中数。 2. 若不相等(假定a>c),则用e分别比较两组数(ab组和cd组)即知结果。
我认为这个比较好: a b c d e 1. a与b 比较,一次, c d e 相互比较三次,找到它们的大小顺序 共四次了2. 那a b中的大的和c d e 中的中间数比较: 回出现以下情况:(假设a>b,c>d>e) (1) a>d 则比较b与d 若b>d则为b . 若b<d则为d (2) a<d 则比较a与e 若a>e则为a . 若a<e则为e3. 这样用6次就能求出了。
a|b c|d e
相互比较
用了两次机会 得到max(a,b),min(a,b),max(c,d),min(c,d),e
把max(a,b)|max(c,d) min(a,b)|min(c,d) e
比较用了两次(共4次了)得到max(a,b,c,d) 和min(a,b,c,d)
从这五个树中排除max(a,b,c,d) 和min(a,b,c,d)
只剩下三个数 假设x,y,z
比较x|y y|z,两次,(共六次)
x>y && y>z
x<y && y>z
x<y %% y<z
三种情况,三种结果
int pivot,i,j;
element temp;
if(left<right){
i=left;j=right+1;
pivot=list[left].key;
do{
do
i++;
while(list[i].key<pivot);
do
j--;
while(list[j].key>pivot);
if(i<j)
swap(list[i],list[j],temp);
}while(i<j);
swap(list[left],list[j],temp);
quicksort(list,left,j-1);
quicksort(lsit,j+1,right);
}
}
第二次比较c与d。这时有三种情况:一、两组数皆不等;二、一组数相等,另一组不等;三、两组数都相等。分别讨论:一、如果两组数皆不等,假定a>b,c>d,则比较b与c(这是第三次比较),又分三种情况:b>c,b=c,b<c。
1. 若b>c,则知a>b>c>d,此时比较e与c(第四次比较),若e>c,则e为中数,否则,c是中数(两数相等时,两者都是中数)。
2. 若b<c,则知已有两个数(d和b)小于c,因此,第四次可比较e与c,又有三种情况:
a) 若e>c,则第五次比较a与c,此时,若a>c则c是中数(因为a和e都比c大,而b和d都比c小),若a=c则a和c都是中数,若a<c则需比较a与d(第六次比较),较大者即为中数,相等则都是中数。
b) 若e<c,则比较e与b(第五次比较),用其中较大者与d比较(第六次),三数(b、d和e)中最大者便是中数(如果有相等的情况参看上文)
c) 若e=c,则比较a与e(第五次比较),若a大则e和c是中数,若e大则a是中数,若一样大则a、c、e都是中数。
3. 若b=c,则知a>b=c>d,故只需比较e与c(第五次比较),若一样大,则b、c、e都是中数,否则(无论e<c还是e>c)b、c都是中数。二、若有一组数相等(假定a>b,c=d),则比较b与c(第三次),分三种情况:
1. 若b>c,则知a>b>c=d,此时比较c和e,若e<c则c和d是中数,若e=c则c、d、e同为中数,若e>c则比较b与e(第四次),若不等,则较小者为中数,否则,同b、e同为中数。
2. 若b=c,则比较e与c(第四次),若相等,则b、c、d、e同为中数,否则b、c、d为中数。
3. 若b<c,则比较a与c(第四次),又三种情况:
a)若a>c,则知a>c=d>b,此时比较e与c(第五次),若相等,则c、d、e同为中数,否则c、d为中数。
b)若a<c,则知c=d>a>b,则比较e与c(第五次),若相等,c、d、e同为中数,若e>c,则c、d为中数,若e<c,则需比较a与e(第六次),若相等,a、e同为中数,否则较大者为中数。
c)若a=c,则知a=c=d>b,比较e与c(第五次),若相等,a、c、d、e同为中数,否则,a、c、d为中数。三、若a=b,c=d,则比较a与c(第三次),分两种情况(a>c与a<c是类似的):
1. 若a=c,则a=b=c=d,只需比较e与a(第四次),若相等,则全为中数(五个数全等),否则,a、b、c、d为中数。
2. 若不相等(假定a>c),则用e分别比较两组数(ab组和cd组)即知结果。
a b c d e 1. a与b 比较,一次, c d e 相互比较三次,找到它们的大小顺序 共四次了2. 那a b中的大的和c d e 中的中间数比较:
回出现以下情况:(假设a>b,c>d>e)
(1) a>d 则比较b与d 若b>d则为b . 若b<d则为d
(2) a<d 则比较a与e 若a>e则为a . 若a<e则为e3. 这样用6次就能求出了。