堆排序
程序员文章站
2022-06-04 10:30:47
...
利用大根堆实现升序序列
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn],n;
void just_heap(int s,int m)//【s+1,m】已经是堆,将【s,m】调整为以a[s]为根的大根堆
{
int key=a[s];
for(int i=2*s;i<=m;i*=2)
{
if(i<m&&a[i]<a[i+1]) i++;
if(key>a[i]) break;
a[s]=a[i],s=i;
}
a[s]=key;
}
void creat_heap()//将无序序列【1,n】建成大根堆
{
for(int i=n/2;i>0;i--)
{
just_heap(i,n);
}
}
void sort_Heap()
{
creat_heap();
int x;
for(int i=n;i>1;i--)
{
x=a[1];
a[1]=a[i];
a[i]=x;
just_heap(1,i-1);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
sort_Heap();
for(int i=1;i<=n;i++) printf("%d ",a[i]);
printf("\n");
}
上一篇: 堆的基本性质与排序算法的实现
下一篇: 设计模式-创建型-单例模式