算法总结(一)-排序

根据时间复杂度排序:

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)

posted @ 2018-09-10 21:22  天才小彩笔i  阅读(165)  评论(0编辑  收藏  举报