***通过一趟快速排序将待排数据分割成独立的左中右三个部分,其中,中部分只含一个数,
左边部分的所有关键字都比这个数小,
右边部分的所有关键字都比这个数大。
***然后再按此方法对这两部分记录分别进行快速排序(这句话显然暗示我们需要用到递归),直到所有记录整理成有序序列。
说明:
还是军训,一排高矮不平的人需要按照教官的命令从低到高的排成一排。
1、在这里,我们令第一个人为分隔身高(简称中间人吧),并且让他出队列与其他人比较,记下这个位置left;
2、从右right 往左遍历,直到有人比中间人矮,记下这个位置right,并把这个人弄到位置left去,(right这个位置空着)
3、从位置left开始遍历,直到有人比中间人高,记下这个位置left, 并把这个人拉到位置right去 (left这个位置空着)
4、假如 left 的位置还是小于 right ,那么继续干上面的事情(2,3)
5、干完这件事儿后,left 位置还是空着的,要把刚才出队列的中间人拉回来,这时候中间人的左边都比他矮,右边都比他高
6、以中间人为界,左边继续做12345,右边也继续做12345
#include<stdio.h>
#define N 10
int QKPass( int *qs , int left, int right)
{
int i;
int temp=qs[left];
while( left<right)
{
while(left<right && temp<qs[right]) right--;
//假如没有判断left<right会发生什么情况呢?
if(left<right)
qs[left++]=qs[right];
//left++为什么呢?
while(left<right && temp>qs[left])left++;
//同上面注释,想想呗;思路懂了,不代表就可以做正确哦,细节也很重要
if(left<right)
qs[right--]=qs[left];
}
qs[left]=temp;
return left;
}
void QKSort( int *qs , int left, int right)
{
int m;
//可以在这里打印出left和right的值看看和你预期的有没有一样,为什么需要left<right的判断
//printf("left=%d right=%d\n",left ,right);
if(left<right)
{
m=QKPass( qs , left , right);
QKSort( qs, left, m-1);
QKSort( qs, m+1, right);
}
}
int main()
{
int i;
int qs[N]={52,49,80,36,14,58,61,97,23,75};
QKSort( qs, 0, N-1);
for( i=0; i<N; i++)
{
printf("%d ",qs[i]);
}
return 0;
}