提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、排序的稳定性
含义:相同的数字排序完之后顺序也不变。例如数组[ 1 1 1_1 11,2, 1 2 1_2 12,3,4]排序完之后变为[ 1 1 1_1 11, 1 2 1_2 12,2,3,4],则该排序稳定,变为[ 1 2 1_2 12, 1 1 1_1 11,2,3,4]则该排序不稳定。
选择排序:不稳定
冒泡排序:稳定(相等时不交换)
插入排序:稳定(相等时不交换)
归并排序:稳定(两个指针指向数字的值相等时先拷贝左边的数字)
快速排序:不稳定(partition过程破坏了稳定性)
堆排序:不稳定(第一步把数组变成大根堆时就破坏了稳定性)
桶排序:计数排序和基数排序都稳定
二、各种排序算法总结
时间复杂度 | 额外空间复杂度 | 稳定性 | |
---|---|---|---|
选择排序法 | O ( N 2 ) O(N^2) O(N2) | O ( 1 ) O(1) O(1) | × \times × |
冒泡排序法 | O ( N 2 ) O(N^2) O(N2) | O ( 1 ) O(1) O(1) | ✓ \checkmark ✓ |
插入排序法 | O ( N 2 ) O(N^2) O(N2) | O ( 1 ) O(1) O(1) | ✓ \checkmark ✓ |
归并排序法 | O ( N ∗ l o g N ) O(N*logN) O(N∗logN) | O ( N ) O(N) O(N) | ✓ \checkmark ✓ |
快速排序法(随机选值) | O ( N ∗ l o g N ) O(N*logN) O(N∗logN) | O ( l o g N ) O(logN) O(logN) | × \times × |
堆排序 | O ( N ∗ l o g N ) O(N*logN) O(N∗logN) | O ( 1 ) O(1) O(1) | × \times × |
无特殊要求情况下一般使用快速排序法,因常数时间最短。
1)目前不存在时间复杂度低于
O
(
N
∗
l
o
g
N
)
O(N*logN)
O(N∗logN)的基于比较的排序算法
2)时间复杂度为
O
(
N
∗
l
o
g
N
)
O(N*logN)
O(N∗logN)且稳定的排序算法中,额外空间复杂度不低于
O
(
N
)
O(N)
O(N)。
工程上对排序的改进
1)充分利用 O ( N ∗ l o g N ) O(N*logN) O(N∗logN)和 O ( N 2 ) O(N^2) O(N2)各自的优势。比如样本量小时,用插入排序,样本量大时用快速排序。