《算法导论》第六章-堆排序(伪代码)
来源:互联网 发布:千牛mac电脑官方下载 编辑:程序博客网 时间:2024/05/22 12:33
堆排序
根据《算法导论》中的伪代码,改写如下,可能更好理解
伪代码:
//建堆,运行时间的界T(n) =O(N)
BuildHeap(A)
n = length(A)
for i = n/2 downto 1 do //从非叶子节点开始,自底往上,使A变成最大堆
Max_Heapify(A, i, n)
end
//调整为最大堆 ,T(n) = O(lgn)
Max_Heapify(A,idx,max) //idx:数组开始的下标,max:最大的数组下标
left = 2*idx
right = 2*idx
if(left<max and A[left]>A[idx]) then
largest = left
else
largest = idx
if(right < max and A[right]>A[largest]) then
largest = ritht
if(largest != idx) then
exchange A[largest] with A[idx]
Max_Heapify(A,largest,max) //交换位置后,还需要调整它的子树
end
HeapSort(A)
BuildHeap(A)
for i = length(A) downto 2 do
exchange A[1] with A[i] //把最大堆根节点与最后一个互换
Max_Heapify(A,1, i-1) //把交互后的排除在堆之外,重新从1到i-1,调整堆
end
性能分析:
时间复杂度:
堆是一个完全二叉树,设树高为k=log2n+1,从根到叶的调整,关键码比较的次数为2(k-1),交换的次数至多为k次。所以比较的次数不超过
2*(log2(n-1)+log2(n-2)+....+log22)<2nlog2n
而比较的次数不超过4n.所以堆排序的时间复杂度为O(nlogn).
空间复杂度:
需要一个单元的辅助空间用于交换,所以辅助空间为O(1).
稳定性:
堆排序调整过程中存在着交换,所以堆排序是一个不稳定的排序算法。
- 《算法导论》第六章-堆排序(伪代码)
- 算法导论第六章堆排序所给的伪代码转换具体程序
- 堆排序(算法导论第六章)
- 算法导论第六章(堆排序)
- 堆排序(依据算法导论伪代码)
- 算法导论第六章堆排序相关代码
- 算法导论第六章-堆排序-Cpp代码实现
- 算法导论: 第六章 堆排序算法
- 《算法导论》第六章-优先级队列(伪代码)
- 算法导论读书笔记 第六章 堆排序
- 算法导论第六章:堆排序
- 算法导论第六章 堆排序总结
- 算法导论第六章 堆排序
- 算法导论 第六章 堆排序
- 【算法导论】第六章之堆排序
- 算法导论第六章 堆排序
- [算法导论]第六章《堆排序》
- 算法导论第六章堆排序思考题
- 漂亮的表格样式(使用CSS样式表控制表格样式)
- IP层实现2--gro
- 开源日志系统比较----scribe,chukwa,kafka和flume
- Gridview中修改某列的背景色
- Bash软件安全漏洞检测及解决方案
- 《算法导论》第六章-堆排序(伪代码)
- jenkis 脚本
- IT忍者神龟之MyEclipse 8.6.1 制作绿色版
- Ubuntu 12.04 中安装和配置 Java JDK
- JDK8 中Stack类的实现
- 【LeetCode】-Search in Rotated Sorted Array
- 图像格式基础
- .vimrc
- 每一位Android开发者应该知道的Android体系架构和开发库