堆排序的两种调整
记录一下堆的两种调整
//小根堆的两种调整
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstdio>
using namespace std;
void adjustUp(int a[],int i){//只能排序a[1,n],插入时使用
if(i==1) return ;
while(i!=1){
if(a[i]<a[i/2]){
swap(a[i],a[i/2]);
i/=2;
}else{
break;
}
}
}
void adjustDown(int a[],int k,int len){//向下调整,删除时使用
int i=k,j=i*2;
while(j<=len){
if(j<len&&a[j]>a[j+1]){
j++;
}
if(a[i]>a[j]){
swap(a[i],a[j]);
i=j;
j*=2;
}else{
break;
}
}
}
int main(){
int n;
int a[100];
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
adjustUp(a,i);
}
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
printf("\n");
swap(a[1],a[n]);
adjustDown(a,1,n-1);
for(int i=1;i<=n;i++){
printf("%d ",a[i]);
}
return 0;
}
/*
8
12 5 78 31 77 64 152 25
*/