快速排序与挑白菜
快排的两个步骤:
1,找基准点;
2,递归1;
挑白菜的方法来解释:
先设定“分段点”为第一个白菜x[0],称为“标准大小的白菜”;
L站x[1],向右挑;R站在x[n-1],向左挑;
循环(直到两人碰面之后停止)
{
循环(L碰见的白菜比“标准”小 && L没有走到头)
{
L继续向右挑白菜;
}
循环(R碰见的白菜比“标准”大 && 没有走到头)
{
R继续向左挑白菜;
}
如果(L在R的左边) /* 这里加这个if条件是因为,有可能L已经跑到R的右边了 */
{
交换白菜;
}
}
最后,R处于的位置就是分段点。
交换分段点与x[0]的白菜,完成“一次划分”。
C代码:
int partition(int x[],int left,int right)
{
int pivot=x[left];
int l;
int r;
int temp;
int middle;
l=left+1;
r=right;
while(l<r)
{
while(x[l] < pivot && l <= right){l++;}
while(x[r] > pivot && r >= left){ r--;}
if(l<r){
temp=x[l];
x[l]=x[r];
x[r]=temp;
}
}
middle=r;
temp=x[middle];
x[middle]=x[left];
x[left]=temp;
return r;
}
void quick_sort(int x[],int left,int right)
{
int middle;
if(left<right)
{middle = partition(x,left,right);
quick_sort(x,left,middle-1);
quick_sort(x,middle+1,right);
}
}
{
int pivot=x[left];
int l;
int r;
int temp;
int middle;
l=left+1;
r=right;
while(l<r)
{
while(x[l] < pivot && l <= right){l++;}
while(x[r] > pivot && r >= left){ r--;}
if(l<r){
temp=x[l];
x[l]=x[r];
x[r]=temp;
}
}
middle=r;
temp=x[middle];
x[middle]=x[left];
x[left]=temp;
return r;
}
void quick_sort(int x[],int left,int right)
{
int middle;
if(left<right)
{middle = partition(x,left,right);
quick_sort(x,left,middle-1);
quick_sort(x,middle+1,right);
}
}