快排思路

 今天写个快排,居然调试了N久。。。orz。。。

 1 void quick_sort(int *arr, int begin, int end)
 2 {
 3     if (begin >= end)
 4     {
 5         return;
 6     }
 7     int i = begin + 1;
 8     int j = end;
 9     while (i < j)
10     {
11         //找到第一个比pivot大的
12         while(arr[i] < arr[begin] && i <= end)
13             ++i;
14         //找到从后往前数第一个比pivot小的
15         while(arr[j] >= arr[begin] && j >= begin)
16             --j;
17         if (i < j)
18         {
19             swap(&arr[i], &arr[j]);
20         }
21         else
22         {
23             //说明已经从pivot开始左右分开了,j是最后一个比pivot小的
24             //交换pivot
25             swap(&arr[begin], &arr[j]);
26         }
27     }
28     quick_sort(arr, begin, j - 1);
29     quick_sort(arr, j + 1, end);
30 }
31 

 

找一个pivot,将小于它的放到左边,将大于它的放到右边,然后再对左右分别递归,返回条件是begin >= end。

pivot一般在begin, middle, end中选取中值。

 

http://baike.baidu.com/view/19016.html 

http://www.comp.nus.edu.sg/~xujia/mirror/algorithm.myrice.com/algorithm/commonalg/sort/internal_sorting/quick_sort/quick_sort.htm 

posted on 2009-11-04 20:01  lbsx  阅读(435)  评论(0)    收藏  举报