标题: 快速排序与挑白菜
- 卡卡.net 2007-04-28 12:19 阅读:307
- 评论:0 | 添加评论

快排的两个步骤:
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);
 }
}

添加评论
返回顶部 | 返回首页