乐趣区

关于数据结构:快速排序

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 时,也就是找到了基准最终在排好序的数组中的地位。所以,须要跳出循环,把最终地位返回。

退出移动版