#include<iostream>
using namespace std;
//headify初始化堆,堆化
//a为待排序的数列,i为当前节点(非叶子节点),n为待排序数列的长度
void heapify(int a[],int i,int n)
{
int l = 2 * i + 1;//当前节点i的左孩子
int r = 2 * i + 2;//当前节点i的右孩子
int largest=i;//首先设置父子节点3个节点中最大值的位置为父节点的下标
if (l<n && a[l] > a[largest])//l要小于n,否则是数组越界,当l节点的值大于i的值的时候,最大值节点的下标为l
{
largest=l;
}
if (r<n && a[r] > a[largest])
{
largest=r;
}
if (largest!=i)//最大节点不是父节点,要进行交换
{
swap(a[i],a[largest]);
//同时要递归保证子树还是最大堆
heapify(a,largest,n);
}
}
//堆排序的算法
void heapsort(int a[],int n)
{
//建立最大堆,从最后一个非叶子节点开始(n/2-1),自下而上,
for (int i=n/2-1 ; i>=0 ; i--)
{
heapify(a,i,n);
}
//调整,将根节点(大顶堆的根节点,也就是最大值)和待排序部分的最后一个节点(下标为 n-1)进行交换,自下而上
for (int i=n-1; i>0 ;i--)
{
swap(a[0],a[i]);
//待排序数组长度减1,对交换到堆顶的元素进行排序,重复直至排序结束
heapify(a,0,i);
}
}
int main()
{
int b[]={99,89,10,32,6,5,2,8,465,33,7,7};
int len=sizeof(b)/sizeof(b[0]);
heapsort(b,len);
for (int i=0;i<len;i++)
{
cout<<b[i]<<" ";
}
return 0;
}
参考:https://zhuanlan.zhihu.com/p/75894663
https://www.cnblogs.com/wanglei5205/p/8733524.html
https://www.jb51.net/article/86168.htm
https://jingyan.baidu.com/article/73c3ce284eed31e50343d9fd.html
https://www.cnblogs.com/chengxiao/p/6129630.html