快速排序2

算法:

1、从数列中挑出一个元素,称为 "基准"(pivot),

2、重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

07.void QuickSort(int *arr, int left, int right)  
08.{  
09.  int i,j;  
10.  if(left<right)  
11.  {  
12.    i=left;j=right;  
13.    arr[0]=arr[i]; //准备以本次最左边的元素值为标准进行划分,先保存其值  
14.    do  
15.    {  
16.      while(arr[j]>arr[0] && i<j)   
17.        j--;        //从右向左找第1个小于标准值的位置j  
18.      if(i<j)                               //找到了,位置为j  
19.      {   
20.        arr[i] = arr[j];  
21.        i++;  
22.      }           //将第j个元素置于左端并重置i  
23.      while(arr[i]<arr[0] && i<j)  
24.        i++;      //从左向右找第1个大于标准值的位置i  
25.      if(i<j)                       //找到了,位置为i  
26.      {   
27.        arr[j] = arr[i];  
28.        j--;  
29.      }           //将第i个元素置于右端并重置j  
30.    }while(i!=j);  
31.    arr[i] = arr[0];         //将标准值放入它的最终位置,本次划分结束  
32.    quicksort(arr, left, i-1);     //对标准值左半部递归调用本函数  
33.    quicksort(arr, i+1, right);    //对标准值右半部递归调用本函数  
34.  }  
35.}  

 

posted @ 2017-06-02 15:23  yl007  阅读(122)  评论(0编辑  收藏  举报