您的位置:首页 > 其它

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

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

证明排序算法的下界

用一个决策树来证明,决策树的深度就是运行时间。通过计算得到结果:
任何比较排序算法在最坏情况下的运行时间要求是Ω(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: