算法导论 学习笔记 第八章 线性时间内的排序

这一主要讲四个内容,第一个是证明比较排序的最坏情况的下界,接下来讲了三个在某种假设的情况下可以线性时间内运行的排序算法:计数排序,基数排序,桶排序。

证明排序算法的下界

用一个决策树来证明,决策树的深度就是运行时间。通过计算得到结果:
    任何比较排序算法在最坏情况下的运行时间要求是Ω(nlgn)。

计数排序

计数排序做的假设是待排序的数组元素都将不超过某个整数k,而且k=O(n)。
按大白话来讲,就是先统计每一个整数在数组大众的个数,然后在从小到大记下来每一个整数前面有多少个数。然后从何后往前把数字放就行了。
上伪代码
COUNTING-SORT(A,B,k)
for i ← 0 to k
    do C[i] ← 0
for j ← 1 to length[A]
    do C[A[j]] ← C[A[j]] + 1
Δ 这里是统计数组中每一个元素的个数
for i ← 1 to k
    do C[i] ← C[i] + C[i-1]
Δ 这个循环式记录小于每一个整数的元素个数
for j ← length[A] downto 1
    do B[C[A[j]]] ← A[j]
        C[A[j]] ← C[A[j]] - 1
Δ 从后往前把数组元素一个一个搬到应有的位置      
这里计数算法是稳定的排序(stable)

基数排序

基数排序感觉比较复杂,他的意思是排序的时候从低位开始排序,等排到最高位的时候数组就已经排好了。
一般是将一个数字分成几个部分而不是按每一个位去排序。这样的话如何选择划分是比较关键的问题。
我也没怎么懂。就不说了。

桶排序

这个就更神奇了,他假设数入的数字是【0,1)的范围并且是均匀分布的。
解释起来比较费劲。
上伪代码
BUCKET-SORT(A)
n ← length[A]
for i ← 1 to n
    do insert A[i] into list B[floor(nA[i])]
for i ← 0 to n-1
    do sort list B[i] with insertion sort
concatenate the lists B[0],B[1],...,B[n-1] together in order
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值