排序之四(线性时间排序)

1.     排序模型

排序时间下界引出的排序模型

o   基于比较的排序(决策树模型):n个元素的决策树叶节点需要n!个叶子。从而树高度由斯特劳林公式可以求得近似为O(nlgn)。因此最优的下限为O(nlgn)。普通排序都是基于比较的,如插入,归并,快排,堆排。其中归并和堆排是渐进最优的。基于比较的排序都可以转换为决策树模型。

o   计数模型:基于计数的排序

o   基数模型:基于不同关键字的排序

  1. 计数排序

应用条件:键值在一个合理的范围1--k,k不是太大。

计数排序思想:要排序A[n].对于每个键值的元素x,先确定比x小的元素的个数,则x的位置即可确定。比如,如果有10个元素比x小,则x一定为第11个元素。

使用k个元素的辅助空间C[k]来存储元素值小于等于(小于等于,因此可以从后往前排出相同元素的键的最后一个的位置)k的元素的个数信息。

使用另一个长度为n的空间B[n]来存储最后的结果。

算法先初始化并计算出C[k]的值。

从A的最后一个元素开始,由C[A[j]]确定第j个位置应该排的位置,从而将该元素填入B中,即B[C[A[j]]]=A[j],并递减C[A[j]]=C[A[j]] -1,因为A[j]的元素已经少一个了。位置需要往前移动一个。

复杂度分析:

空间复杂度:O(n+k)。辅助的计数空间和存储空间。

时间复杂度:O(n+k)。计算C[k]需要O(k),排序填B[n]需要O(n)。同时依赖于k和n。当k为O(n)时,时间复杂度即为O(n)。如果k为n^2或2^n等非线性的,则复杂度和O(nlgn)相比可能就更耗时了。

稳定性:是稳定的排序。从A的最后一个元素扫描时是稳定的,如果从前往后扫描则不稳定。

原地性:不是原地排序。

应用

元素取值相对不太大。即每个key都比较小。或者k为O(n)的。

l  如果处理的数字都比较小,如都为一个字节的[0,256],则C只需要256个长度即可,时间复杂度为O(256+n)。这时候n较大也只为线性的。

l  如果key可能为任何整数,则k为2^32则所需的C比较大,为2^32,大约为16G。

l  收索中,如果热门关键词不是太多,但是从用户cookie中提取后,需要找出最热门的关键字。则可以使用计数排序。

  1. 基数排序

基数排序的典故。打孔机,人口普查问题。

基数排序思想:多关键字排序。如果关键字为简单的整数,则可以按个位,十位,等等分作不同的关键字位。从关键字较低的位置开始到高关键字每个关键字进行稳定排序。注意每个关键字的排序必须稳定,否则不正确。直到最高为关键字排序完。则排序结束。对于整数,关键字的划分也可以按字节进行划分。高字节低字节划分为不同的关键字。

实际处理时,结合计数排序,将要排序的数按固定位数的bit位进行划分关键字。对每个关键字内部用计数排序进行排序。

如:n个数,每个数最多为b个bit位。则数的取值范围为1--2^b-1。按b/r来划分关键字,即将n个b个bit位的数,每个按r个bit进行划分。

复杂度分析:(以上述划分方法)

空间复杂度:O(n+2^r)计数排序的空间复杂度。

时间复杂度:共划分出b/r个关键字,每个关键字的一趟排序为O(n+k)即O(n+2^r);从而总的时间为O(b/r * (n+2^r) ).

b,n是由数组给定的,r是可选的。因此选择r使得上式达到最小值即可。标准为对上式求导来求极值。特别也可以b*n/r和b*2^r/r相当,即r=lgn的时候。带入上式,得时间为O(bn/lgn)。b为key的bit数,因此key的范围为0到2^b-1;如果key范围和n的关系上,如果key在0到n^d-1即最多为元素个数的d次方。则时间为O(d*n)。如果d为O(1)的,则时间为O(n)的。

稳定性:稳定的排序。

原地性:不是原地的

应用:与计数比,不再要求key的范围不是太大的要求。比如如果对取值可能为int的数,则按8bit取值进行划分。则只需要256个辅助空间。进行4论计数排序。相反如果是O(nlgn)的比较排序则,如果比较的个数n为2000,需要lgn轮大约11次比较。但是计数和基数比较空间复杂度要求较高,因此一般情况下还是快排等方法比较好,除非key比较小。

  1. 桶排序

应用条件:输入符合均匀分布,值在0到1之间;则可以在O(n)时间内排序。和计数要求key不太大一样,桶排序要求输入均匀分布在0到1之间。

排序思想:由限制条件。将[0,1)均匀划分为n个区间,或称作桶。再将n个输入分布到桶中。由于均匀的假设,则每个桶中一般不会有太多个元素。为了排序,只需先对每个桶进行排序,再顺序输出每个桶即可。

复杂度

时间复杂度:期望复杂度为O(n).

应用:如果输入不均匀时,只要各桶尺寸的平方和桶中元素的个数呈线性,则也可以。

  1. 算法下界

对于key取值在1个机器指令操作内的情况,目前最优nlglgn,nlglgn^1/2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值