关于排序的总结(稳定性与复杂度)
目录:
- 稳定性
- 复杂度
稳定性与复杂度
稳定性:指排序后,相同元素保持出现的先后顺序。
时间复杂度是O(N2),额外空间负责度O(1):
- l 冒泡排序:当遇到相同数时,该数不交换,将后面的数往下沉。可以稳定;
- l 插入排序:当遇到相同数时,该数不交换;可以稳定;
- l 选择排序:做不到稳定性。因为你要从后面的所有数中找到最小的,然后将前面的某一个a与该最值交换,如果有多个a存在,那么,a的先后顺序将无法保证。故做不到。
复杂度是O(N*logN):
- l 归并排序:merge时,当相同时先拷贝左边(小区域)的数;可以稳定; 额外空间复杂度为O(N);
- l 快排:做不到稳定性; 额外空间复杂度为O(logN);
- l 堆排:做不到稳定性。在建大根堆的时候,就都已经不能保证稳定性了。 额外空间复杂度为O(1);
排序 | 稳定性 | 时间复杂度 | 额外空间复杂度 |
冒泡排序 | 稳定 | O(N2) | O(1) |
插入排序 | 稳定 | O(N2) | O(1) |
选择排序 | 不 | O(N2) | O(1) |
归并排序 | 稳定 | O(N*logN) | O(N) |
快排 | 不 | O(N*logN) | O(logN) |
堆排 | 不 | O(N*logN) | O(1) |
在补一补哈:
排序分类大概有这些,上面的知识列出了比较常见的:
再补一个全的:
发现这一个更全:
注:
1 归并排序可以通过手摇算法将空间复杂度降到O(1),但是时间复杂度会提高。
2 基数排序时间复杂度为O(N*M),其中N为数据个数,M为数据位数
辅助记忆
- 时间复杂度记忆
1. 冒泡、选择、直接 排序需要两个for循环,每次只关注一个元素,平均时间复杂度为O(n2)O(n2)(一遍找元素O(n)O(n),一遍找位置O(n)O(n))
2. 快速、归并、希尔、堆基于二分思想,log以2为底,平均时间复杂度为O(nlogn)O(nlogn)(一遍找元素O(n)O(n),一遍找位置O(logn)O(logn))
- 稳定性记忆---“快希选堆”(快牺牲稳定性)
1. 排序算法的稳定性:排序前后相同元素的相对位置不变,则称排序算法是稳定的;否则排序算法是不稳定的。
Over。。。
参考:
1. 排序算法时间复杂度、空间复杂度、稳定性比较(里面有动图,很好理解)