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()
中会有两个参数 low
和 high
??
因为在排序过程中,排序的数组的起始地位和终止地位是变动,而不是 0
到 (array.length-1)
不变的。
2)quickSort
终止条件为什么是 low >= high
,而不是 low > high
??
当 low == high
时,表明,此时数组中只有一个元素。数组中只有一个元素时,它在最终排好序的数组中
地位是和以后地位一样的,不须要进行排序。
3)在 getPosition()
中为什么是 while (low < high)
,而不是 while (low <= high)
??
当 low == high
时,也就是找到了基准最终在排好序的数组中的地位。所以,须要跳出循环,把最终地位返回。