【牛客BAT算法】1.排序

目录

基础知识

时间复杂度

空间复杂度

稳定性

案例一:已知一个有序的数组,几乎有序是指,若排好序,每个元素移动的距离不超过K,且K较数组长度很小。问选用何种算法好。

案例二:判断数组中是否有重复值。要求额外空间复杂度为O(1)。

案例三:数组合并

案例四:荷兰国旗问题(三色排序)只包含0,1,2的整数数组进行排序,要求只使用原地交换,不使用计数排序

案例五:排好序的矩阵中找到K

案例六:需排序的最短子树组长度

案例七:给定非排序数组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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值