一、数组的堆化
堆的存储结构采用数组的形式,以大根堆为例(每个根结点值大于其子女的值)。堆数据在数组中的父子关系反映为第i个结点的父结点为(i-1)/2,其左子女(若有的话)下标为2*i+1,右子女(若有的话)为2*i+2。
void makebigheap(heaptree &htree,int a[],int n)
{
htree.maxsize=2*n;
htree.heapsize=n;
htree.heap=new int[2*n];
memcpy(htree.heap,a,n*sizeof(int));
int i,tempnode,itemp,itempchild;
for(i=(n-2)/2;i>=0;i--)
{
itemp=i;
itempchild=2*itemp+1;
tempnode=htree.heap[i];
while(itempchild<htree.heapsize)
{
if(itempchild+1<htree.heapsize&&htree.heap[itempchild]<htree.heap[itempchild+1])
itempchild++;
if(htree.heap[itemp]>htree.heap[itempchild])
break;
htree.heap[itemp]=htree.heap[itempchild];
htree.heap[itempchild]=tempnode;
itemp=itempchild;
itempchild=2*itempchild+1;
}
//htree.heap[(itempchild-1)/2]=tempnode;
}
}
二、堆排序
堆的排序为依次删除根结点:每次删除根结点,然后将数组最后的结点设为根结点,然后调整整个堆,使之满足大根堆的关系,然后再重复删除,直到数组内的元素删除完毕。
void sortbigheap(heaptree &htree)
{
int i=0;
int ichild;
int size=htree.heapsize;
while(size>0)
{
cout<<htree.heap[0]<<" ";
i=0;
ichild=2*i+1;
while(ichild<size)
{
if(ichild+1<size&&htree.heap[ichild]<htree.heap[ichild+1])
ichild++;
if(htree.heap[size-1]>htree.heap[ichild])
break;
htree.heap[i]=htree.heap[ichild];
htree.heap[ichild]=htree.heap[size-1];
i=ichild;
ichild=2*ichild+1;
}
htree.heap[(ichild-1)/2]=htree.heap[size-1];
size--;
}
//cout<<htree.heap[0];
delete []htree.heap;
}
总的代码:
#include <iostream>
using namespace std;
struct heaptree
{
int *heap;
int heapsize,maxsize; //heapsize为实际存储的个数;maxsize为数组的总长度,大于heapsize(可以大的空间提供插入)
};
void makebigheap(heaptree &htree,int a[],int n); // 将数组a进行堆化,数组的长度为n
void sortbigheap(heaptree &htree); //进行堆排序
void main()
{
heaptree htree;
int *a;
int i,n;
cout<<"please input the number of heap:\n";
cin>>n;
a=new int[n];
for(i=0;i<n;i++)
{
cout<<"please input a number:\n";
cin>>a[i];
}
makebigheap(htree,a,n);
cout<<"the result of heap_sort is:\n";
sortbigheap(htree);
}
void makebigheap(heaptree &htree,int a[],int n)
{
htree.maxsize=2*n;
htree.heapsize=n;
htree.heap=new int[2*n];
memcpy(htree.heap,a,n*sizeof(int));
int i,tempnode,itemp,itempchild;
for(i=(n-2)/2;i>=0;i--)
{
itemp=i;
itempchild=2*itemp+1;
tempnode=htree.heap[i];
while(itempchild<htree.heapsize)
{
if(itempchild+1<htree.heapsize&&htree.heap[itempchild]<htree.heap[itempchild+1])
itempchild++;
if(htree.heap[itemp]>htree.heap[itempchild])
break;
htree.heap[itemp]=htree.heap[itempchild];
htree.heap[itempchild]=tempnode;
itemp=itempchild;
itempchild=2*itempchild+1;
}
//htree.heap[(itempchild-1)/2]=tempnode;
}
}
void sortbigheap(heaptree &htree)
{
int i=0;
int ichild;
int size=htree.heapsize;
while(size>0)
{
cout<<htree.heap[0]<<" ";
i=0;
ichild=2*i+1;
while(ichild<size)
{
if(ichild+1<size&&htree.heap[ichild]<htree.heap[ichild+1])
ichild++;
if(htree.heap[size-1]>htree.heap[ichild])
break;
htree.heap[i]=htree.heap[ichild];
htree.heap[ichild]=htree.heap[size-1];
i=ichild;
ichild=2*ichild+1;
}
htree.heap[(ichild-1)/2]=htree.heap[size-1];
size--;
}
//cout<<htree.heap[0];
delete []htree.heap;
}