快排思路
今天写个快排,居然调试了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
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
浙公网安备 33010602011771号