包括:建立、插入一个节点、删除其中一个节点,用最小堆排序。
#include <iostream>
using namespace std;
int const len=10;
//建立一个最小堆
int left(int i)
{
return 2*i+1;
}
int right(int i)
{
return 2*i+1+1;
}
int parent(int i)
{
return (i+1)/2-1;
}
void minheapify(int *A,int i,int heapsize)
{
int l=left(i),r=right(i);
int smallest=i,temp=0;
if (l<heapsize&&A[l]<A[i])
smallest=l;
else
smallest=i;
if(r<heapsize&&A[r]<A[smallest])
smallest=r;
if(smallest!=i)
{
temp=A[i];
A[i]=A[smallest];
A[smallest]=temp;
minheapify(A,smallest,heapsize);
}
}
void buildheap(int *A,int heapsize)
{
for(int i=len/2-1;i>=0;i--)
{
minheapify(A,i,heapsize);
}
}
void heapinsert(int *A,int &heapsize,int key)
{
heapsize++;
int i=heapsize-1;
A[i]=key;
int p=parent(i),temp;
while(p>=0&&A[p]>A[i])
{
temp=A[p];
A[p]=A[i];
A[i]=temp;
i=p;
p=parent(i);
}
}
void heapdelete(int *A,int i,int &heapsize)
{
A[i]=A[heapsize-1];
heapsize--;
minheapify(A,i,heapsize);
}
int main()
{
int A[len];
int heapsize=0,temp;
for (int i=0;i<len;i++)
cin>>A[i];
//建堆
heapsize=len-2;//,可以自己设置堆的大小,此处堆的大小不等于数组的大小。
buildheap(A,heapsize);
for (int i=0;i<heapsize;i++)
cout<<A[i]<<' ';
cout<<endl;
//插入新的结点,在堆的后面加上一个新元素,然后将其浮上去。
heapinsert(A,heapsize,1);
for (int i=0;i<heapsize;i++)
cout<<A[i]<<' ';
cout<<endl;
//从中删除结点。在删除的结点处,运行minheapify,因为该结点的左右子树均为最小堆,满足运行minheapify的条件。
heapdelete(A,2,heapsize);
for (int i=0;i<heapsize;i++)
cout<<A[i]<<' ';
cout<<endl;
//最小堆排序,逆序的
for(int i=heapsize-1;i>=1;i--)
{
temp=A[i];
A[i]=A[0];
A[0]=temp;
heapsize--;
minheapify(A,0,heapsize);
}
for (int i=0;i<len;i++)//输出数组所有的元素。
cout<<A[i]<<' ';
}