在数据结构中,我们学习了几种排序,但是现在我想我们呢要更深入的学习排序,我们可以把排序的时间在升级一个层次
其中,一部分图片来源于哈佛算法公开课。
- 排序算法上的这几种排序都有一个名字:比较排序
- 时间复杂度都是大于Θ(NlgN)
- 接下来我们希望排序的时间可以在线性时间层级内
- 这些排序算法称之为:线性时间排序
1.决策树推导
(1)决策树的定义
- 决策树是一种树形结构,其中每个内部节点表示一个属性上的判断,每个分支代表一个判断结果的输出,最后每个叶节点代表一种分类结果。
- 在这里可以先用二叉树的理解代替决策树
- 若将a1,a2,…,a_n做比较
- 对于任意i,j其中i,j属于{1,2,···,n}
- 若a_i<a_j,则左子树显示后续的比较
- 若a_i>a_j,则右子树显示后续的比较
(2)决策树模型
- 该模型是一个输入n个数的模型
- 每次比较两个元素,并将算法是为拆分
- 该模型包含所有可能的比较结果
- 它并不是答案,而是一个过程,需要数据在该模型里面按照指令往下走
- 算法的运行时间:正比于所走路径的长度
- 算法最坏的运行时间:正比于树的高度
(3)决策树排序的下限
- 其下限是:Ω(NlgN)
- 证明
- 其中,h是树的高度,n是需要排序数的数量
2.计数排序
(1)规定
- 通常来说,其输入是一个数列,我们需要限定它的范围,总共有k个整数
- 因为这是一种时间换空间的做法
(2)步骤
- 先遍历一次,找出待排序队列的最大最小,根据其差值申请数组空间
- 遍历元素,出现一次,记录其元素值对应的数组自加1
- 在数组的第n个位置加和前面的n-1个数组的值
- 按照数组最后一个位置分配空间,排序
(3)分析 - 第一步时间复杂度:Θ(k)
- 第二步时间复杂度:Θ(n)
- 第三步时间复杂度:Θ(k)
- 第四步时间复杂度:Θ(n)
- 总共为Θ(n+k)
- 这也就是基数排序不流行的主要因为,当k过大,会导致效率很低很低,其次是因为,他不能排序浮点数
- 但这不影响它很稳定
其中排序的稳定性指:
- 保证了相等元素的顺序,称之为相对顺序
- 在图示中,我们有三个2,在排序完后,2的顺序维持之前的顺序
3.基数排序
(1)定义
- 数字位置归纳
(2)步骤
- 确定数组中最大元素的位数,确定执行轮次
- 创建10个桶,从0至9
- 按照元素个位、十位、百位···的顺序进行大小排序
- 每一次排序如下图所示
(3)分析 - 假设有n个数,每个数有b位
- 在二进制中,其取值范围位0~2^b-1
- 我们将b位分为r块,r时计算机一次性处理的位数
- 如果计算机处理时是按照8个数字进行处理,那么对于32位操作系统来说,需要处理4轮
- 基数排序是借用计数排序的思想的
- 那么处理一次需要用Θ(n+2^r)
- 总共要处理b/r次
- 所以其时间是下图:
当然,这个算法也是稳定的。