堆排序

来源:互联网 发布:相片日历制作软件 编辑:程序博客网 时间:2024/05/18 00:02

INPUT

6

5 9 8 4 6 88

OUTPUT

4 5 6 8 9 88

#include<stdio.h>int h[101];int n;void siftdown(int i);void swap(int x,int y);void creat();int deletemin();void swap(int x,int y)//交换两个数{int t;t=h[x];h[x]=h[y];h[y]=t;return;}void siftdown(int i)//向下调整函数{int t,flag=0;//flag用来标记是否需要交换while(i*2<=n&&flag==0){if(h[i]>h[i*2])//当父节点的值比左子节点大时t=i*2;elset=i;if(i*2+1<=n)//当存在右子节点时再进行比较{if(h[t]>h[i*2+1])t=i*2+1;}if(t!=i){swap(t,i);i=t;}else{flag=1;}}return;}void creat()//建堆{int i;for(i=n/2;i>=1;i--){siftdown(i);}return;}int deletemin()//删除最小值的操作{int t;t=h[1];h[1]=h[n];n--;siftdown(1);return t;}int main(){int i,num;scanf("%d",&num);for(i=1;i<=num;i++){scanf("%d",&h[i]);//输入堆里面的数字}n=num;creat();for(i=1;i<=num;i++){printf("%d ",deletemin());}return 0;}