浅谈堆
来源:互联网 发布:蜻蜓fm收音机mac版 编辑:程序博客网 时间:2024/06/07 01:47
什么是堆?,是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。高度为lg n。明确了定义之后看一下有关堆得基础算法模板。
1.该操作主要用于维持堆的基本性质。假定以t和t为根的子树都已经是堆,然后调整以t为根的子树,使之成为堆。
void heapadjust(int a[],int t,int n) {int i=t*2,te=a[t];while(i<=n) {if(i+1<=n&&a[i]>a[i+1]) i++;if(te>a[i]) {a[t] = a[i];t=i;i*=2;}else i=n+1;}a[t] = te;}
2.创建堆
void buildheap(int *a,int n) {int i;for(i=n/2; i>0; i--) heapadjust(a,i,n);}
3.往堆里面插入数据
void insert(int *a,int t,int n) {n++;a[n] = t;int te = t,i=n/2,j=n;while(i>1 &&a[i]>te) {a[j] = a[i];j=i;i/=2;}a[j] = te;}
4.输出堆排序
void heapsort(int a[],int n) {int i,te;for(i=n; i>0; i--) {cout<<a[1]<<' ';te = a[1];a[1] = a[i];a[i] = te;heapadjust(a,1,i-1);}cout<<endl;}
自己根据这些模板写了段简单代码,可以参考一下:
//堆得建立heapadjust,调整heapadjust,插入insert,堆排序输出heapsort#include<iostream>#include<cstdio>#include<cmath>using namespace std;void heapadjust(int a[],int t,int n) {int i=t*2,te=a[t];while(i<=n) {if(i+1<=n&&a[i]>a[i+1]) i++;if(te>a[i]) {a[t] = a[i];t=i;i*=2;}else i=n+1;}a[t] = te;}void heapsort(int a[],int n) {int i,te;for(i=n; i>0; i--) {cout<<a[1]<<' ';te = a[1];a[1] = a[i];a[i] = te;heapadjust(a,1,i-1);}cout<<endl;}void buildheap(int *a,int n) {int i;for(i=n/2; i>0; i--) heapadjust(a,i,n);}void insert(int *a,int t,int n) {n++;a[n] = t;int te = t,i=n/2,j=n;while(i>1 &&a[i]>te) {a[j] = a[i];j=i;i/=2;}a[j] = te;}int main(){int n,a[10],i,m;cin>>n>>m;for(i=1; i<=n; i++) cin>>a[i];buildheap(a,n);insert(a,m,n);heapsort(a,n+1);return 0;}
0 0
- 浅谈堆
- 浅谈 堆
- 浅谈堆和栈
- 浅谈堆与栈
- 浅谈堆排序
- 合并果子,浅谈堆
- 浅谈堆排序
- 浅谈堆与栈
- 优先队列(堆)浅谈
- 浅谈数据结构——堆
- 浅谈数据结构—堆(heap)
- 浅谈Java堆和栈
- 浅谈堆排序的堆调整及时间复杂度
- 堆区和堆栈的浅谈
- 浅谈排序算法(三)之堆排序
- 浅谈堆和栈的区别
- 堆区和堆栈的浅谈
- 浅谈java内存中的堆和栈
- 几行代码轻松实现网页视频聊天
- Activity 的属性之android:screenOrientation
- SQL中EXISTS的用法
- 关于int全区变量读写的原子性
- tomcat多个端口的使用
- 浅谈堆
- Red5研究
- 动态获取当前时间显示
- Centos 5.x RHEL 5.x 安装salt升级Zmq2.x 到Zmq4.x
- 主程的晋升攻略(6):CGI和FastCGI
- Josephus约瑟夫问题及其变种
- 世界互联网大会今日开幕 亮点揭秘
- jquery easy ui 新弹出的dialog 每次都显示第一次load的数据
- Dimension screen=Toolkit.getDefaultToolkit.getScreenSize();//获取屏幕尺寸对象