算法导论 学习笔记 第八章 线性时间内的排序
2017-08-04 11:33
218 查看
这一主要讲四个内容,第一个是证明比较排序的最坏情况的下界,接下来讲了三个在某种假设的情况下可以线性时间内运行的排序算法:计数排序,基数排序,桶排序。
上伪代码
COUNTING-SORT(A,B,k)
上伪代码
BUCKET-SORT(A)
证明排序算法的下界
用一个决策树来证明,决策树的深度就是运行时间。通过计算得到结果: 任何比较排序算法在最坏情况下的运行时间要求是Ω(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
相关文章推荐
- 第八章线性时间排序之“基数排序RADIX-SORT”(练习8.3-1)
- 算法导论_第八章_线性时间排序
- 第八章 线性时间排序 8.2 计数排序
- 第八章 线性时间排序 8.3 基数排序
- 算法导论 第八章:线性时间排序
- 第八章 线性时间排序 8.2 计数排序
- 算法导论第八章-线性时间排序-Cpp代码实现
- 算法导论第八章线性时间排序课后答案
- 第八章 线性时间排序 8.3 基数排序
- 算法导论第八章总结:线性时间排序
- 第八章线性时间排序之“桶排序BUCKET-SORT”
- 算法导论:第8章 线性时间排序__计数排序
- 算法导论:第8章 线性时间排序__基数排序
- 排序算法(五)-- 线性时间排序之计数排序
- 线性时间排序
- 算法导论 第8章 线性时间排序 课后习题
- 线性时间排序
- 排序0-n^k-1范围内的n个数,要求时间复杂度为线性
- 基数排序--基于计数排序的线性时间复杂度的排序算法
- 2011-03-06 算法导论 第8章 线性时间排序