快速排序

快速排序的基本思想是先找一个基准数,经过分区过程后,使得左边的数都小于这个基准数,右边的数都大于这个基准数,然后对这个基准数左边的子数组和右边的子数组递归进行排序,这样最后基准数左右两边都是已经排序好的子数组;

排序算法上可以对待排序的数组左右两边分别设置两个哨兵,左边的哨兵从左往右依次扫描,遇到小于基准数的直接通过,遇到大于基准数的停下来,记下位置i,右边的哨兵从右往左依次扫描,遇到大于基准数的通过,遇到小于基准数的停下来,记下位置j,然后比较两个哨兵的位置,如果i < j ,则交换位置i和j上的元素,左右哨兵继续扫描,不管哪边的哨兵与另一个哨兵相遇(也就是他们的下标相等)就都停下来,如果相遇位置的元素小于基准数,则交换基准数和相遇位置的元素,否则不做交换,并且设置partionValue=基准数的新位置下标(如果发生过交换,partionValue=相遇位置,否则partionValue还是等于基准数原来的位置);通过这一轮排序后就可确定partionValue左边的数都小于基准数,partionValue右边的数都大于基准数,然后对partionValue左边的子数组和右边的子数组分别递归排序;

图解如下:

 

这个是初始状态,基准数是第一个数6;

代码实例如下:

 1 void exchange(int arr[], int i, int j) {
 2     int temp = arr[i];
 3     arr[i] = arr[j];
 4     arr[j] = temp;
 5 }
 6 
 7 void QuickSort(int[] arr, int i, int j) {
 8     if (i >= j)  return;
 9     int center = Partion(arr, i, j);
10     QuickSort(arr, i, center - 1);
11     QuickSort(arr, center + 1, j);
12 }
13 
14 int Partion(int[] arr, int left, int right) {
15     int temp = arr[left];
16     int i = left + 1;
17     int j = right;
18     
19     while (i != j) {
20         while (i < j && arr[j] >= temp)
21             j--;
22         while (i < j && arr[i] <= temp)
23             i++;
24         if (i < j)
25             exchange(arr, i, j);
26     }
27     
28     if (arr[i] < arr[left]) {
29         arr[left] = arr[i];
30         arr[i] = temp;
31         return i;
32     } else
33         return left;
34 }

 

posted on 2018-04-25 11:23  小夏coding  阅读(136)  评论(0编辑  收藏  举报

导航