1330: 堆 堆排序
时间限制: 1 Sec 内存限制: 128 MB题目描述
输入
n
个数,要求用堆排序输出从小到大排完序后的结果。
输入
第一行输入
n(n<=100000)
,表示元素个数。
第二行输入这
n
个数
(longint
范围内
)
。
输出
按照从小到大的顺序输出。
样例输入
4
3 2 4 1
样例输出
1 2 3 4
不多说了,直接放代码了。
以后留作参考吧!
#include <cstdio> #include<iostream> #include<algorithm> using namespace std; long int h[101000]; int n; void siftdown(int i) { int t,flag=0; while( i*2<=n&&flag==0 ) { if( h[i] <h[i*2] ) t=i*2; else t=i; if(i*2+1<=n) { if(h[t]<h[i*2+1]) t=i*2+1; } if(t!=i) { swap(h[t],h[i]); i=t; } else flag=1; } } void creat() { int i; for(i=n/2;i>=1;i--) { siftdown(i); } } void heapsort() { while(n>1) { swap(h[1],h[n]); n--; siftdown(1); } } int main() { int i,num; scanf("%d",&num); for(i=1;i<=num;i++) scanf("%ld",&h[i]); n=num; creat(); heapsort(); for(i=1;i<=num;i++) printf("%ld ",h[i]); }