1. 根本思维

疾速排序的根本思维是基于分治法的。

  • 在待排序数组中选取一个元素作为基准,假如以第一个元素为基准。
  • 每趟排序都能确定基准的地位。找到基准在数组中最终寄存的地位。右边是所有比该元素小的值,左边是所有比该元素大的值。
  • 而后再别离对右边和左边两局部递归排序。直到每局部只有一个元素时进行排序。

实用场景

只实用于 程序构造 (也就是数组),不能对链式构造排序。

工夫复杂度

均匀复杂度:O(nlogn),最好复杂度:O(nlogn),最坏复杂度:O(n^2)

空间复杂度

空间复杂度 :O(logn)

2. 代码实现(java)

public void sort(int[] array) {    quickSort(array, 0, array.length - 1);}// 对区间是[low, high]的数组进行排序,一轮排完之后,确定了第一个元素的地位public void quickSort(int[] array, int low, int high) {    if (low >= high) return;   // 终止条件    // 找到第一个元素(阈值)在最终的排序数组中的地位    // 将区间 [0,len-1] 之间按阈值划分为 <阈值, >阈值 两局部    int pos = getPosition(array, low, high);    quickSort(array, low, pos - 1);  // 对 <阈值 的局部排序    quickSort(array, pos + 1, high);  // 对 >阈值 的局部排序}public int getPosition(int[] array, int low, int high) {    int tmp = array[low];   // 以第一个元素作为基准    while (low < high) {        // 从后向前找到比基准小的数        while (low < high && array[high] >= tmp) high--;        array[low] = array[high];  // 把array[high]移到后面        // 从前向后找到比基准大的数        while (low < high && array[low] <= tmp) low++;        array[high] = array[low];  // 把array[low]移到前面    }    array[low] = tmp;   // 把基准放在最终的地位上    return low;  // 返回最终的地位}

3. 代码阐明

1)quickSort() 中会有两个参数 lowhigh ??

因为在排序过程中,排序的数组的起始地位和终止地位是变动,而不是 0 (array.length-1) 不变的。

2)quickSort 终止条件为什么是 low >= high ,而不是 low > high ??

low == high 时,表明,此时数组中只有一个元素。数组中只有一个元素时,它在最终排好序的数组中

地位是和以后地位一样的,不须要进行排序。

3)在 getPosition() 中为什么是 while (low < high) ,而不是 while (low <= high) ??

low == high 时,也就是找到了基准最终在排好序的数组中的地位。所以,须要跳出循环,把最终地位返回。