线性时间排序

一般说来,我们经常使用的都是比较排序,就是在排序过程中要进行比较操作,事实证明,比较排序的最好的时间复杂度是O(nlogn),但是在一些情况下,可以使用一些线性时间的排序方法。

计数排序

计数排序是假设输入x个整数,每个数都在0~k之间的一个整数,这样不需要比较操作,就可以将数列排列成序。代码简单如下所示:

计数排序

粗略的排序过程如下图所示:

计数排序过程

根据上图可知,计数排序总体可以分为以下几个步骤:
1. 遍历数列,找出最大的数据maxVal
2. 开辟一个长度为maxVal + 1的计数数组,并初始化为0
3. 将源数组中的数据copy到一个临时数组,这样可以保证在原数组上排序
4. 遍历数组,统计数组中每个整数出现的数据量,填入计数数组
5. 从1开始,C(x) = C(x) + C(x -1),将计数数组中对应的数据相加,可以知道,该值表示了计数数组对应索引值在排序数组中的最大索引值,比如说C[3] = 7,表示 3 这个数据在排序数组中的最大索引是 6,而排序数组中总共有3个 3,即表示该数组中数据 3 的正确索引值应该是 6,5,4。
6. 将值放入到对应的位置,减去计数数组中的对应位置的值,直至数列有序。

可以看到,计数排序的适用范围并不大,我们可以用他来排列整数或字母(利用字母-‘a’)。

我们可以对其做一点点优化,再遍历一次,找出数列中的最小值minVal,然后将这些值对应到[0, maxVal - minVal]之间,但是当数据跨度很大的时候,很明显这种方法是无效的,比如说最小值是 0,最大值是 100,那么我们不得不开101个整数空间。此时,选取其他方法是更明智的选择。

整体说来,计数排序,就是以空间换时间的做法。

基数排序

基数排序是一种用在卡片机上的排序算法,该算法从整数位的最低有效位开始,将数据排列成序,直至最高有效位排序成序,这样,整个数列就已经排列成序。排序过程如下所示:

基数排序

从上可知,对于有效位不相同的整数,我们需要找出最长的整数,然后在前面补 0 直至位数相同,然后才好使用此方法,我个人觉得该算法的实用性不强,而且排序算法也不太好写,在此不提供。而且对于每位数的排序,还要依赖其他的排序算法。

桶排序

桶排序是假设数据服从均匀分布,根据一定规则将一个区间分成若干个小区间,每个小区间称为桶,然后使用插入排序,将数据插入到桶,每个桶之间独立有序,然后将每个桶按顺序连接起来,整个数列就已排列有序,该排序算法, 在桶之间的排充,也要使用其他的排序算法, 在此也不排供代码示例。在 《算法导论》 中找到这样一幅描述图,如下所示:

桶排序

从图上可以看到,以每个数据的最高位为区分,然后将对应的数据插入到其中的链表中,使得每个桶独立成序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值