排序(二)(升序)
以下都不是基于比较的算法,它们都是线性时间复杂度
桶排序
额外条件:输入数据 Al,A2 ,.. ., AN 必须只由小于M 的正整数组成
算法思想
- 使用一个大小为 M 称为Count的数组,它被初始化为全0
- Count有M个元素,即M个桶,且桶初始化为空
- 当读入Ai时,Count[i]加1
- 在所有的输入数据读入后,扫描数组Count,打印出排序后的表
性能分析
算法用时O(M+N),即O(N)
计数排序
算法思想
对每一个输入元素x,确定出小于x的元素个数,有了这一信息,就可以把x直接放在它在最终输出数组的位置上
- 找出待排序的数组中最大和最小的元素
- 统计数组中每个值为i的元素出现的次数,存入数组C的第i项
- 对所有的计数累加(从C中的第一个元素开始,每一项和前一项相加)
- 反向填充目标数组:将每个元素i放在新数组的第C(i)项,每放一个元素就将C(i)减去1
性能分析
当输入的元素是n个0到k之间的整数时,它的运行时间是 O(n + k)
基数排序
算法思想
将待排数据中的每组关键字依次进行桶分配
基数排序(以整形为例),将整形10进制按每位拆分,然后从低位到高位依次比较各个位。主要分为两个过程:
- (1)分配,先从个位开始,根据位值(0-9)分别放到0~9号桶中(比如53,个位为3,则放入3号桶中)
- (2)收集,再将放置在0~9号桶中的数据按顺序放到数组中
重复(1)(2)过程,从个位到最高位(比如32位无符号整形最大数4294967296,最高位10位)
性能分析
基数排序的性能比桶排序要略差。
- 每一次关键字的桶分配都需要O(N)的时间复杂度,而且分配之后得到新的关键字序列又需要O(N)的时间复杂度。假如待排数据可以分为d个关键字,则基数排序的时间复杂度将是O(d*2N),当然d要远远小于N,因此基本上还是线性级别的。
- 基数排序的空间复杂度为O(N+M),其中M为桶的数量。一般来说N>>M,因此额外空间需要大概N个左右。
特点
为稳定排序算法
参考资料:计数排序、桶排序和基数排序