#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100;
int heap[maxn],n=10;
void downAdjust(int low,int high){//向下调整大顶堆
int i=low,j=i*2;
while(j<=high)//存在孩子节点
{
if(j+1<=high&&heap[j+1]>heap[j])
j=j+1;
if(heap[j]>heap[i]){
swap(heap[i],heap[j]);
i=j;
j=i*2;
}
else break;
}
}
void creatHeap(){//创建大顶堆
for(int i=n/2;i>=1;i--)
downAdjust(i,n);
}
void deleteTop(){
heap[1]=heap[n--];
downAdjust(1,n);
}
void upAdjust(int low,int high){//向上调整大顶堆
int i=high,j=i/2;
while(j>=low){
if(heap[i]>heap[j]){
swap(heap[i],heap[j]);
i=j;
j=i/2;
}
else break;
}
}
void insert(int x){//插入新节点
heap[++n]=x;
upAdjust(1,n);
}
void heapSort(){//堆排序
creatHeap();
for(int i=n;i>=1;i--){
swap(heap[i],heap[1]);
downAdjust(1,i-1);
}
}
int main(int argc, char** argv) {
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&heap[i]);
heapSort();
printf("\n");
for(int i=1;i<=n;i++)
printf("%d ",heap[i]);
return 0;
}
堆及堆排序的基本操作
最新推荐文章于 2024-07-15 13:32:43 发布