8-线性时间排序-算法导论
2016-06-02 21:33:09 5 举报
AI智能生成
算法导论-8-线性时间排序算法-个人笔记
作者其他创作
大纲/内容
渐进记号
大omiga , *, 大O——依次表示渐进下界,上下界,上界
注:以后的笔记中 上下界一律用F(.)表示
比较排序
通过比较元素大小排序
例如:堆排序,归并排序,快速排序
可抽象为一个决策树模型(是完全二叉树)
定理
最坏情况下,任何比较排序都需要做大omiga( nlgn )次比较
计数排序
基本思想
对于输入的元素x,确定小于它的元素个数,然后将x放到它在输出数组中的位置
算法: Counting-Sort(A,B,k)
令C[0,...,k]为新数组并初始化为零
对A中相同元素个数进行计数: C[ A[j] ] = C[ A[j] ] + 1, j=1 to A.length
对A中每一个元素,计算小于该元素的元素个数:C[i] = C[i] + C[i-1], i=1 to k
根据上一步结果,将A中元素放入输出数组B中对应位置:
时耗
F(k+n)——即:关于k+n的上下界
优于比较排序的上界 大omiga( nlgn )
一般当 k=O(n)时,推荐采用计数排序
基数排序
基本思路:将元素从个位开始对齐,然后比较个位元素并据此排序—>转十位并排序—>...—>输出结果
算法:Radix-Sort( A,d )
根据第i位的数值大小排序, i=1 to d
时间复杂度
若给定n个位数,每一数位有k个可能取值。 如果采用稳定的排序算法F(n+k),则时耗为 F( d(n+k) )
选择适当的排序算法做基数排序时,尽管基数排序的平均时耗可以控制在F(n),但是它真不一定比快速排序快(因为它的F(n)常数项比较大)
桶排序
前提:假定输入数据服从均匀分布
基本思路
将[0,1)划分为n个相同大小的子区间,称为桶,然后将数据放入各桶中;
因为数据是[0,1)上的 均匀分布,所以一般不会只落入一个桶,此时对各个桶分布进行排序,然后遍历各个桶给出最终结果
注意:将遍历输入数组A以放入桶的过程相当于对A进行了一个分层操作,每一个桶里存放的数据一定是在桶的大小范围内的
算法:Bucket-Sort(A)
记n=A.length; 定义新数组B[1,...,n-1]
将B[i]初始化为空链表
将A[i] 插入到 B[ nA[i] ]处, i=1 to n
用插入排序排列链表B[i], i=0 to n-1
遍历B[0],...,B[n-1]以便把结果放在一起得出最中排列结果
时耗:F(n)
此方法稳定,比快速排序还要快,但是空间复杂度非常高
注意:即使输入不服从均匀分布,但满足所有桶的大小平方和与总的元素呈线性关系,那么桶排序仍然可以在线性时间内完成
0 条评论
下一页