根据时间复杂度排序:
O(n2): 冒泡、选择、插入
O(nlogn): 归并、快速、希尔、堆
O(n): 计数、基数
根据空间复杂度排序:
O(1): 冒泡、选择、冒泡、希尔、堆
O(logn)~O(n): 快速
O(n): 归并
O(m): 计数、基数
稳定性:
稳定: 冒泡、插入、归并、计数、基数
不稳定: 选择、快速、希尔、堆
* 排序算法无绝对优劣
数组较小时,选择插入排序为优。数组较大时,选择O(nlogn)的排序算法为优。
常见问题类型:
1. 几乎有序数组,排序时元素移动距离小于k。选择算法:
思路 : O(N)级别算法不做考虑,O(N2)的算法中冒泡、选择与数组有序性无关,选插入算法为优,复杂度不超过O(N*K);
O(NlogN)算法中快排和归并复杂度与数组有序性无关。使用改进后的堆排序为优,复杂度为O(K*logN);
2.判断数组中是否有重复值,必须保证额外空间复杂度为O(1)
思路: 若无空间复杂度的限制,可以考虑用哈希表来实现。所以这里采用非递归版的堆排序来实现,即先排序,再判断。
3.合并两个有序数组
思路: 在一个数组扩大到元素总数大小,从后往前插入最大元素+排序
4.荷兰国旗问题,0、1、2的证书,使用交换。原地排序而不利用计数进行排序
思路: 与快排划分类似。时间复杂度为O(N),额外空间复杂度为O(1)
5.有序二维数组中找是否有指定元素
思路: 从左下角或者右上角开始比较
6.找出数组中最短需排序子数组长度。如[1,5,4,3,2,6,7]->[5,4,3,2]
思路: 先从左到右遍历,找出最右size,再从右往左遍历,找出最左size。最优空间复杂度为O(N),额外空间复杂度为O(1)
7.给定整型数组arr,返回排序后相邻的最大差值
思路: 使用桶排序。关心空桶间距。时间复杂度为O(N),额外空间复杂度为O(N)