快速排序
快速排序的基本思想是先找一个基准数,经过分区过程后,使得左边的数都小于这个基准数,右边的数都大于这个基准数,然后对这个基准数左边的子数组和右边的子数组递归进行排序,这样最后基准数左右两边都是已经排序好的子数组;
排序算法上可以对待排序的数组左右两边分别设置两个哨兵,左边的哨兵从左往右依次扫描,遇到小于基准数的直接通过,遇到大于基准数的停下来,记下位置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 }