#include <bits/stdc++.h>
using namespace std;
//大顶堆 ,逻辑结构为完全二叉树,存储结构为一维数组
/*
小顶堆的插入:
每次插入都是将新数据放在数组最后。
// 新加入i结点 其父结点为i/2
void MinHeapFixup(int a[], int i)
{
int j, temp;
temp = a[i];
j = i/2; //父结点
while (j >= 1 && i != 1)
{
if (a[j] <= temp)
break;
a[i] = a[j]; //把较大的子结点往下移动,替换它的子结点
i = j;
j = i/2;
}
a[i] = temp;
}
*/
int n;
int length;
int a[1005];
void HeapAdjust(int a[],int s,int m) //筛选,s是要筛选结点的下标,m是最后一个结点下标
{//s,j分别是父结点和左孩子结点的下标
int temp=a[s]; //暂存到temp变量中
for(int j=2*s;j<=m;j*=2) //j是i结点的左孩子下标
{
if(j<m&&(a[j]<a[j+1])) //j要小于m,不然j+1就越界了
++j; //筛选左右孩子最大的结点的下标
if(!(temp<a[j])) //如果temp>=左右孩子,就跳出循环,不用交换
break;
a[s]=a[j]; //执行到这里,说明要交换
s=j;
}
a[s]=temp;
}
void HeapSort(int a[])
{
for(int i=length/2;i>=1;i--) //对非终端节点依次筛选,从length/2开始(即最后一个非终端结点)
{
HeapAdjust(a,i,length);
}
for(int i=length;i>1;--i) //将堆顶与最后一个元素交换,再对[1,i-1]重新调整为大顶堆
{
swap(a[1],a[i]);
HeapAdjust(a,1,i-1);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
length=n;
HeapSort(a);
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
数据结构堆排序
最新推荐文章于 2022-08-13 16:49:56 发布