什么是堆?,是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。高度为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;
}