快排:8 1 9 3 4 2 5 6(设为数组R[100],开始数字设为left,结束数字设为right)
首先取第一个数字8为哨兵,令 j 指向最右边的数字,i指向最左边的数字,从j开始向左移动寻找比哨兵小的数字,然后i从第二个数字开始开始向右寻找比哨兵大的数字,然后j、i所指的数字互换;
继续j向左移动寻找比哨兵小的数,i继续向右照比哨兵大的数字,然后互换,直到 i 与 j 相遇,把 i 指向的数字与哨兵互换,完成一次快排;第一次快排完成后原来的数字分为两组,左边一组是都比哨兵小的数字,开始为left,结束为i(j)+1;右边一组是都比哨兵大的数字,开始为i(j)-1,结束为right,然后两组分别进行上面的排序。
代码:
void Quick_sort(int R[],int left,int right){
//查找
if(left > right)//循环停止条件********
return;
int x = R[left];
int i = left,j = right;
while(i < j){
while(i < j && R[j] >= x)
j--;
while(i < j && R[i] <= x)//如果j == i,下边交换的数字就不是原来要交换的数字,快排失效
i++;
int b = R[i];
R[i] = R[j],R[j] = b;
}
int y = R[i];
R[i] = x,R[left] = y;
//分治(递归)
Quick_sort(left,i-1);
Quick_sort(i+1,right);
}