堆排序 C++实现

来源:互联网 发布:mcgs组态软件实例教程 编辑:程序博客网 时间:2024/06/08 23:44
//堆排序其实分为了三个函数  建堆,维护堆,排序。其中最基础的应该就是维护堆这个函数了#include <iostream>using namespace std;inline int left(int );inline int right(int );void maintainHeap(int *,int );void buildHeap(int *,int );void printfHeap(int *,int );void swap(int &,int &);void heapsort(int *arry,int length);static int heapsize=0;inline int left(int i)    //设置为内联函数,加快执行速度{return 2*i;}inline int right(int i){return 2*i+1;}void maintainHeap(int *arry,int i)    //维护堆的性质{int largest=0;int l=left(i);int r=right(i);  if(l<=heapsize && arry[l]>arry[i])  largest=l;         else        largest=i;  if(r<=heapsize && arry[r]>arry[largest])        largest=r;  if (largest!=i)    {  swap(arry[largest],arry[i]);  maintainHeap(arry,largest);      //继续递归调用,可以改写成循环来做,提高程序的执行效率,有空在改写吧    }}void buildHeap(int *arry,int length){int i=0;i=length/2;            //找到最后一个非叶节点while(i>=1)            //向上开始维护堆的性质{  maintainHeap(arry,i);  i--;}}void swap(int &a,int &b){int temp;temp=b;b=a;a=temp;}void printfHeap(int *arry,int length){for(int i=1;i<length;i++)  cout<<arry[i]<<" ";  cout<<endl;}void heapsort(int *arry,int length){buildHeap(arry,heapsize);            //首先建堆length=heapsize;while(length>=2){  cout<<arry[1]<<" ";                      //输出堆顶最大的元素  swap(arry[1],arry[length--]);          //将最大的元素与堆的最后一个节点交换  heapsize--;                            //此时堆的规模需要减1  maintainHeap(arry,1);                 //每次维护以根节点的堆}cout<<arry[length];  //输出最后一个元素}int main(){int a[11]={0,2,6,12,345,4,3,67,-1,9,21};heapsize=10;buildHeap(a,heapsize);printfHeap(a,heapsize);cout<<"--------------------------------------------------------"<<endl;heapsort(a,heapsize);return 0;}


原创粉丝点击