- 快速排序简介
- 实现(java)
- 复杂度和稳定性
1.快速排序简介
交换排序, 使用分治的思想, 选择一个基准数, 左边的元素比基准数小, 右边的元素比基准数大, 递归对左右2部分使用同样的方式排序. 假设选择第一个数为基准数, 右索引从右向左查找比基准数小的元素, 左索引查找比基准数大的元素, 如果左索引小于右索引, 交换左索引和右索引上的元素, 直到左索引大于等于右索引
2.实现(java)
public class QuerySort {
public static void main(String[] args) {
int[] arr = {40, 35, 5, 63, 21, 82, 96, 77, 52, 19};
System.out.println("原数组: " + Arrays.toString(arr));
sortArr(arr, 0, arr.length - 1);
System.out.println("排序后: " + Arrays.toString(arr));
}
public static void sortArr(int[] arr, int left, int right) {
if(left >= right) {
return;
}
int base = arr[left];
int i = left, j = right;
while (i < j) {
// 右索引查找比基准数小的元素
while (i < j && arr[j] >= base) {
j--;
}
// 左索引查找比基准数大的元素
while (i < j && arr[i] <= base) {
i++;
}
if(i < j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
arr[left] = arr[i];
arr[i] = base;
sortArr(arr, left, i - 1);
sortArr(arr, i + 1, right);
}
}
3.复杂度和稳定性
排序算法 | 最好时间复杂度 | 最坏时间复杂度 | 平均时间复杂度 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
快速排序 | O(nlog2n) | O(n2) | O(nlog2n) | O(log2n) | 不稳定 |
最好的情况(左右2部分平均), 时间复杂度为O(nlog2n))
最坏的情况(正序或逆序), 时间复杂度为O(n2)
空间复杂度可理解为递归的深度, 递归的实现依靠栈, 需递归log2n+1次, 故空间复杂度为O(log2n)