详细讲解请参照此博客内容:https://www.cnblogs.com/chengxiao/p/6129630.html
#include <iostream>
using namespace std;
void sort(int a[],int n);
void maxHeap(int a[],int i,int n);
void swap(int &a,int &b);
int main()
{
int arry[]={4,6,8,5,9};
sort(arry,5);
for (int i=0;i<5;i++)
cout<<arry[i]<<" ";//打印堆排序后的数组
cout<<endl;
system("pause");
return 0;
}
void sort(int a[],int n)
{
//构建大顶堆
for (int i=n/2-1;i>=0;i--)//从最后一个非叶子结点开始从上往下,从右往左开始遍历
maxHeap(a,i,n);
//调整堆结构+交换堆顶元素与末尾元素
for (int j=n-1;j>0;j--)
{
swap(a[0],a[j]);//交换第一个数与最后一个数,此时数组的最后一个数为最大数
maxHeap(a,0,j);
}
}
//调整最大堆(仅是调整过程,建立在大顶堆已构建的基础上
void maxHeap(int a[],int i,int n)
{
int temp=a[i];
for (int k=2*i+1;k<n;k=k*2+1)//从i的左子结点开始
{
if (k+1<n && a[k+1]>a[k])//如果左子结点小于右子结点,k指向右子结点
k++;
if (a[k]>temp)//如果子结点大于父结点,将子结点赋给父结点
{
a[i]=a[k];
i=k;
}
else
break;
}
a[i]=temp;
}
void swap(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}