快速排序与挑白菜

快排的两个步骤:
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);
 }
}
原文地址:https://www.cnblogs.com/caca/p/730908.html