目录
案例一:已知一个有序的数组,几乎有序是指,若排好序,每个元素移动的距离不超过K,且K较数组长度很小。问选用何种算法好。
案例二:判断数组中是否有重复值。要求额外空间复杂度为O(1)。
案例四:荷兰国旗问题(三色排序)只包含0,1,2的整数数组进行排序,要求只使用原地交换,不使用计数排序
案例七:给定非排序数组arr,返回排序后,相邻两数的最大差值
基础知识
时间复杂度
O(N^2):冒泡排序,选择排序,插入排序
O(N*logN):归并排序,快速排序,堆排序,希尔排序
桶排序:不是基于比较的排序
计数排序:O(N)
基数排序:
空间复杂度
O(1):插入,选择,冒泡,堆排,希尔
O(logN)~O(N):快排
O(N):归并
O(M):计数排序,基数排序, M为桶的数量
稳定性
稳定的排序算法:
冒泡,插入,归并,计数排序,基数排序,桶排序
不稳定的排序算法:
选择,快排,希尔,堆排
补充说明一:排序算法无绝对优劣
通常不能随便说哪种排序算法好。
这个和要排序的元素相关,
例如对人的年龄或身高排序,因为数据范围通常比较小,可以考虑采用计数排序。
但是对于均匀分布的整数,计数排序就不合适了。
除非面试题特别说明,否则认为要排序的数据范围是均匀分布的
补充说明二:工程上的排序
1.工程上的排序是综合排序
2.数组较小,插入排序;数组较大,快速排序或其他O(N*logN)
--------------------------------------------------------------
计数排序:
例子:比较员工身高,张三168,李四175,王五180
答案:
因人的身高范围为100-300cm,建立100-300号桶,员工据身高入桶,即完成排序
基数排序
例子:023,014,101,072,084,011 从小到达排序
答案:
排序过程为
按个位入桶,从0~9号桶依次倒出101,011,072,023,014,084
再按十位入桶,从0~9号桶依次倒出101,011,014,023,072,084
再按百位入桶,从0~9号桶依次倒出011,014,023,072,084,101
------------------------------------------------------------------------------------------------
案例一:已知一个有序的数组,几乎有序是指,若排好序,每个元素移动的距离不超过K,且K较数组长度很小。问选用何种算法好。
答案:
O(N):计数,基数:不适用
O(N^2):冒泡、选择:与数组原始序列无关
插入:与原始顺序有关,若选用,则时间复杂度为O(N*K)
O(N*logN):快排、归并:与原始序列有关
最佳方法:
改进后的小根堆
因移动距离不超过K,
所以最小值在a[0]-a[k-1],建立小根堆,a[0]为堆顶最小值,弹出
同理,第二小值在a[1]-a[k-1],建立小根堆,a[1]为堆顶,即第二小值
........
每排一个数O(logK),共N个数,则时间复杂度为O(NlogK)
案例二:判断数组中是否有重复值。要求额外空间复杂度为O(1)。
答案:
若空间无限制,使用哈希表,时间为O(N),空间为O(N)。
正确解:
先排序,再判断
使用非递归堆排序,因为空间复杂度为O(1),所以时间复杂度为O(N*logN)
案例三:数组合并
(简单,过)
案例四:荷兰国旗问题(三色排序)只包含0,1,2的整数数组进行排序,要求只使用原地交换,不使用计数排序
答案:
与快排划分过程类似,时间复杂度O(N),空间复杂度为O(1)
{} 1,1,0,0,2,1,1,0,{ }
0区 2区
从左到右遍历数组,遇到1,跳过,
遇到0,与0区后一个数交换(其实就是扩展0区)
遇到2,与2区前一个数交换(其实就是扩展2区)
遍历到2区的第一个数,结束
理解:其实就是0往左交换,2往右交换,1不动,整个数组就被分成了三堆
案例五:排好序的矩阵中找到K
举例:
0 1 2 5
2 3 4 7
4 4 4 8
5 7 7 9
答案:
理解:转折点开始找
从矩阵右上角开始找
cur>k,往左
cur<k,往下
cur==k,结束
案例六:需排序的最短子树组长度
[1,5,4,3,2,6,7] 返回4,因只有[5,4,3,2]需要排序
答案:
[1,5,4,3,2,6,7]
max=1 5 X X X 6 7 从左往右,比较,递增
1 X X X 2 6 7=min从右往左,比较,递减
【 】
X的重合部分长度为4,所以为4
时间复杂度为O(N),空间复杂度为O(1)
案例七:给定非排序数组arr,返回排序后,相邻两数的最大差值
举例:某数组排序后为1,2,3,4,7,8,9,最大差值为7-4=3
答案:
【图示:】
最优解,时间复杂度为O(N),空间复杂度为O(N)
思想来自于桶排序, 额外空间与数组范围无关
7,9,3,4,2,1,8 min=1,max=9
共7个数,所以[1,9)分为7个等区间,各对应一个桶
把最大值max=9单独放在N+1号桶中
所有数入桶后,1号桶中会有最小值,N+1号桶有最大值
N个数,N+1个桶,所以必然中间有空桶
桶内元素间差值必小于区间长度,空桶两边元素差值必大于区间长度
所以,只考虑桶间相邻数,不考虑桶内元素间,
后一个桶的最小值-前一个桶的最大值,求max
{1,1,3,1,1} 所以,max=3