浅谈堆

来源:互联网 发布:蜻蜓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
原创粉丝点击