稳定性 | 时间复杂度 | 空间复杂度 | ||
---|---|---|---|---|
选择 | ×(交换时可能跨元素交换) | O ( n 2 ) O(n^2 ) O(n2) | O ( 1 ) O(1) O(1) | |
冒泡 | √(相等时不交换) | O ( n 2 ) O(n^2 ) O(n2) | O ( 1 ) O(1) O(1) | |
插入 | √(相等时不交换) | O ( n 2 ) O(n^2 ) O(n2) | O ( 1 ) O(1) O(1) | |
归并 | √(优先归并左侧) | O ( n ∗ log n ) O(n * \log{n}) O(n∗logn) | O ( n ) O(n) O(n) | 需要使用稳定性时使用 |
快速 | ×(交换时可能跨元素交换) | O ( n ∗ log n ) O(n * \log{n}) O(n∗logn) | O ( log n ) O(\log{n}) O(logn) | 优先选择,常数项最低 |
堆 | ×(交换时可能跨元素交换) | O ( n ∗ log n ) O(n * \log{n}) O(n∗logn) | O ( 1 ) O(1) O(1) | 空间限制极大时使用 |
计数 | √ | |||
基数 | √ |
稳定性
局限
改进或调整(综合排序)
执行 n 轮
每轮(i)扫一次剩余数组,记录极值的位置 n,然后交互 i,n 位置的元素
复杂度:
O
(
n
2
)
O(n^2 )
O(n2),
O
(
1
)
O(1)
O(1)
执行 n 轮
每轮扫一次剩余数组,相邻元素按序交互顺序(若正序排列,i > i+1 的元素,交互)
复杂度:
O
(
n
2
)
O(n^2 )
O(n2),
O
(
1
)
O(1)
O(1)
执行 n 轮
每轮(i)保证前 i 个元素都有序(前 1 个元素有序,然后前 2 个元素有序,然后前 3 个元素有序)
从第 i 个元素往前比,反序就交换
复杂度:
O
(
n
2
)
O(n^2 )
O(n2),
O
(
1
)
O(1)
O(1)
数组拆分两边,
对左侧排序,对右侧排序,注意前面两个排序也是归并排序,然后归并
归并过程如下:
归并的作用:
复杂度:
O
(
n
∗
log
n
)
O(n * \log{n})
O(n∗logn),
O
(
n
)
O(n)
O(n)
套用 master :
T
(
n
)
=
2
∗
(
n
/
2
)
+
O
(
n
)
T(n) = 2 * (n / 2) + O(n)
T(n)=2∗(n/2)+O(n)
整个过程如下
复杂度:
O
(
n
∗
log
n
)
O(n * \log{n})
O(n∗logn),
O
(
log
n
)
O(\log{n})
O(logn)
因为是随机取数,存在概率
若直接取最右元素,则可能存在最差情况,此时复杂度为
O
(
n
2
)
O(n^2)
O(n2),
O
(
n
)
O(n)
O(n)
快速排序算法每一层递归时,只有几个指针,所以单层是
O
(
1
)
O(1)
O(1)
堆排序是使用堆的特性进行排序
整个过程如下,以大顶堆为例
复杂度: O ( n ∗ log n ) O(n * \log{n}) O(n∗logn), O ( 1 ) O(1) O(1)
统计公司所有年龄的员工的个数,如 [20,50,10,60,30,60…]
准备年龄表,索引表示年龄,值表示统计个数即可
但若是其他统计,统计表可能很大,所以不适用,比如 基数排序
基于桶
以 10 进制举例 [11,32,36,28,59,100,67]
常规对数值的排序先参考最高位,因为最高位权重最大,然后参考权重的下一位,以此类推
但这是基于分段排序的,即在对权重稍低的位进行排序时,只能在其权重稍高的位一致的基础上进行,否则相当于打乱了上一轮排序
而基数排序则是将这个过程反过来,通过一轮进桶出桶保证低位的有序性
这使得在下一轮权重稍高的位排序时,同一个桶的元素一定是按权重稍低的位的顺序排布的
这使得即使再整体范围,下一轮排序也不会消除上一轮排序的作用
复杂度: O ( n ∗ log w e i g h t n ) O(n * \log_{weight}{n}) O(n∗logweightn), O ( n ) O(n) O(n)
基于词序表
可以将桶改为词序表
以 10 进制举例 [11,32,36,28,59,100,67]
复杂度:
O
(
n
∗
log
w
e
i
g
h
t
n
)
O(n * \log_{weight}{n})
O(n∗logweightn),
O
(
n
)
O(n)
O(n)
词序表空间复杂度为
O
(
log
n
)
O(\log{n})
O(logn),但整理数组时需要一个与原数组等大小的区域,所以是
O
(
n
)
O(n)
O(n)