先说说堆:
首先堆是一种完全二叉树,根据特点不同分为大根堆和小根堆。
大根堆呢就是树上任意非叶子节点的值都大于其左右端点(左右端点之间不在意大小),对应的小根堆就是树上任意非叶子节点值都小于其左右端点。
图示:
堆排序呢就是根据不同堆的特性将其整理为一个最大(小)堆后,移除根节点,并作调整的递归运算。
本代码只是将乱序整理为最小堆的代码,并未真正排序(相当于进行了一次堆排序)
附代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
#define int long long
int A[10005]; int flag;
void tiaozheng(int t){
flag=0;//判断是否已整理完毕
for(int i=t/2;i>=1;i--){
if((i*2+1)>t){
if(A[i]>A[2*i]){
swap(A[i],A[2*i]); flag=1;
}
}
if((i*2+1)<=t){
int k=2*i,l=2*i+1;
if(A[k]<A[l]&&A[i]>A[k]){
swap(A[k],A[i]); flag=1;
}
if(A[k]>A[l]&&A[i]>A[l]){
swap(A[i],A[l]); flag=1;
}
}
}
}
signed main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int t; cin>>t;
for(int i=1;i<=t;i++) cin>>A[i];
for(int i=1;i<=t;i++){
tiaozheng(t);
if(flag==0) break;
}
for(int i=1;i<=t;i++) cout<<A[i]<<" ";
return 0;
}