#include <iostream>
using namespace std;
const int maxn=8;
int a[maxn]={36,30,18,40,32,45,22,50};
//假设一颗完全二叉树,其左右子树都是堆,调整后会破坏一颗子树的堆结构,需要再对该子树进行调整
void heapAdjust(int k,int last) //k为要调节的结点,last为最终结点
{
int i=k,j=2*i+1,temp; //i指向要调整的结点,j指向i的左孩子
while(j<=last) //i为叶子时停止
{
if(j+1<=last&&a[j]<a[j+1]) j=j+1; //j指向左右孩子的最大者
if(a[i]>a[j]) break; //已经是堆
else
{
temp=a[i];a[i]=a[j];a[j]=temp; //交换
i=j;j=2*j+1; //下一循环调整被破坏的子树
}
}
}
void heapSort()
{
//从最后一个非叶子结点调整堆,最终建成一个大根堆
for(int i=maxn/2-1;i>=0;i--)
{
heapAdjust(i,maxn-1);
}
//堆排序
for(int i=1;i<=maxn-1;i++)
{
int temp=a[0];a[0]=a[maxn-i];a[maxn-i]=temp;
heapAdjust(0,maxn-i-1);
}
for(int i=0;i<maxn;i++)
{
cout<<a[i]<<" ";
}
}
int main()
{
heapSort();
return 0;
}
堆排序 代码
最新推荐文章于 2022-01-11 10:55:19 发布