//堆排序其实分为了三个函数 建堆,维护堆,排序。其中最基础的应该就是维护堆这个函数了
#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;
}
堆排序 C++实现
最新推荐文章于 2023-12-08 15:30:30 发布