笔试之排序算法(二)

来源:互联网 发布:利达信tk832 软件 编辑:程序博客网 时间:2024/06/01 09:40

排序(二)(升序)

以下都不是基于比较的算法,它们都是线性时间复杂度

桶排序

额外条件:输入数据 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个左右。

特点

为稳定排序算法

参考资料:计数排序、桶排序和基数排序

原创粉丝点击