堆操作与堆排序
2013-11-11 19:35
344 查看
首先,我们来认识堆:
堆的建立:将给定的序列按层次遍历建立完全二叉树,然后从最后一个非终端结点开始自下向上逐步调整为堆。
这里就有两个重要的操作,shift_up(int t)和shift_down(int t),这样我们就建立了堆。
对于堆排序,就相当于每次取出堆顶的元素值,这样是从大到小排序的,因为建立的是大顶堆。堆排序是一种树型
选择排序。
现在来详细说一点:比如对于序列:5 8 9 7 6 4
按照层次遍历建立完全二叉树得到:
然后自底向上调整为大顶堆。
对于插入操作,是在原来堆的后面加上被插入的元素,然后自下而上调整堆,每次操作复杂度为O(log(n))。
对于删除操作,就是把位于堆最后的那个元素覆盖到被删除元素的位置,然后调整堆,堆的size--。
而对于堆排序,就是每次删除堆顶元素,把每次删除的元素值保存在S[]里,删除完毕后得到序列是一个有序序列,
也就是完成了排序,这样可以知道堆排序的时间复杂度为O(nlog(n))。
堆的建立:将给定的序列按层次遍历建立完全二叉树,然后从最后一个非终端结点开始自下向上逐步调整为堆。
这里就有两个重要的操作,shift_up(int t)和shift_down(int t),这样我们就建立了堆。
对于堆排序,就相当于每次取出堆顶的元素值,这样是从大到小排序的,因为建立的是大顶堆。堆排序是一种树型
选择排序。
现在来详细说一点:比如对于序列:5 8 9 7 6 4
按照层次遍历建立完全二叉树得到:
然后自底向上调整为大顶堆。
对于插入操作,是在原来堆的后面加上被插入的元素,然后自下而上调整堆,每次操作复杂度为O(log(n))。
对于删除操作,就是把位于堆最后的那个元素覆盖到被删除元素的位置,然后调整堆,堆的size--。
而对于堆排序,就是每次删除堆顶元素,把每次删除的元素值保存在S[]里,删除完毕后得到序列是一个有序序列,
也就是完成了排序,这样可以知道堆排序的时间复杂度为O(nlog(n))。
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; const int N = 105; int Heap ; int size; void shift_up(int t) { bool done = 0; if(t == 0) return; while(t != 0 && !done) { if(Heap[t] > Heap[(t-1)/2]) swap(Heap[t],Heap[(t-1)/2]); else done = 1; t = (t-1)/2; } } void shift_down(int t) { bool done = 0; if(2*t+1 > size) return; while(2*t+1 < size && !done) { t = 2 * t + 1; if(t+1 < size && Heap[t+1] > Heap[t]) t++; if(Heap[(t-1)/2] < Heap[t]) swap(Heap[(t-1)/2],Heap[t]); else done = 1; } } void Insert(int x) { if(size >= N) return; size++; Heap[size-1] = x; shift_up(size-1); } void Delete(int t) { int last = Heap[size-1]; size--; if(t == size) return; Heap[t] = last; shift_down(t); } int Delete_maxval() { int tmp = Heap[0]; Delete(0); return tmp; } int main() { int n; while(cin>>n) { size = 0; for(int i=0;i<n;i++) { int val; scanf("%d",&val); Insert(val); } while(size > 0) cout<<Delete_maxval()<<" "; cout<<endl; } return 0; }
相关文章推荐
- iOS 如何选择delegate、notification、KVO
- 计算机视觉领域的一些牛人博客,超有实力的研究机构等的网站链接
- 祝QQ永远快乐
- TCP的工作原理,TCP的流量控制原理,滑动窗口,拥塞窗口,ACK累计确认等
- struts2拦截器的配置
- Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
- 理解模版
- 虚拟机中Ubuntu在命令行下用户无法登录
- 百度地图之驾车路线的搜索
- android ListView 嵌套listview
- Reverse Nodes in k-Group
- NYOJ 427 Number Sequence
- Spring事务传播特性实例解析
- 判断是否是回文数
- 认识opencv
- 大规模企业网站集群如何实现会话保持?
- Qt窗口屏幕居中显示
- 从虚拟机能ping通主机,而主机无法ping通虚拟机
- 开发者的下一个金矿-------企业App
- java 计算器