| 算法 | 时间复杂度 | 空间复杂度 |
|---|---|---|
| 快速排序 | 最优O(nlgn) 最差O(n²) | 最差O(n)最优O(lgn) |
| 堆排序 | O(nlgn) | O(1) |
| 归并排序 | O(nlgn) | O(n)用来将两个排好序的数组合并 |
| 选择排序 | O(n²) 每次都要遍历一遍没有最优 | O(1) |
| 插入排序 | 最优 O(n) 数组已经排序 最差 O(n²) 逆序排序 | O(1) |
| 冒泡排序 | 最优 O(n) 数组已经排序 最差 O(n²) 逆序排序 | O(1) |
快排虽然最差是O(n²),但平均还是O(nlgn) 其中堆排序,快速排序,选择排序是不稳定的算法,相等元素的相对位置会发生改变。 选择排序,举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了
快速排序,比如序列为 5 3 3 4 3 8 9 10 11, 现在中枢元素5和3(第5个元素,下标从1开始计)交换就会把元素3的稳定性打乱
快排的空间复杂度取决于递归栈的层数,如果每次找到的主元位置很偏,将问题分解成 1 n-1的子问题,那栈的层数是n,就是o(n),最好的情况每次在中间平分数组,分解为 n/2 n/2的问题,栈层数是logn,空间复杂度是o(logn)