堆排序

来源:互联网 发布:淘宝店铺转让风险 编辑:程序博客网 时间:2024/06/02 01:41

一、数组的堆化

堆的存储结构采用数组的形式,以大根堆为例(每个根结点值大于其子女的值)。堆数据在数组中的父子关系反映为第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进行堆化,数组的长度为nvoid 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;}

0 0
原创粉丝点击