c语言 快速排序 求解疑
#include<stdio.h>#define SWAP(x,y){int t=x;x=y;y=t;}
void qs(int number[],int left,int right) {
int i,j,s;
if(left<right){
s=number[left];
i=left;
j=right+1;
while(1){
while(i+1<10&&number[++i]<s);
while(j-1>-1&&number[--j]>s);
if(i>=j)
break;
SWAP(number[i],number[j]);
}
number[left]=number[j];
number[j]=s;
qs(number,left,j-1);
qs(number,j+1,right);
}
}
main()
{
int k;
int a[10]={41,24,76,11,45,64,21,69,19,36};
qs(a,0,9);
for( k=0;k<10;k++){
printf("%d\n",a[k]);
}
getch();
}
其中 有2个语句不理解:
number[left]=number[j];
number[j]=s;
我知道 这是在把中枢轴的值与 最小的值交换 但我认为是 number[left]=number[i]; number[i]=s; 因为 上面swap(a[i],a[j]) 不是已经不是交换了吗?? 例如 下面的 41和 21交换
透过以下演算法,则轴左边的值都会小于s,轴右边的值都会大于s,如此再对轴左右两边进行
递回,就可以对完成排序的目的,例如下面的实例,*表示要交换的数,[]表示轴:
[41] 24 76* 11 45 64 21 69 19 36*
[41] 24 36 11 45* 64 21 69 19* 76
[41] 24 36 11 19 64* 21* 69 45 76
[41] 24 36 11 19 21 64 69 45 76
21 24 36 11 19 [41] 64 69 45 76