NOJ1066-堆排序

堆排序

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 414            测试通过 : 220 

比赛描述

给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中堆排序算法进行排序,并输出排序最后结果的相应序列。


输入

 

共两行,第一行给出排序元素数目n,第二行给出n个元素,1n100000,每个元素值范围为 [0100000)

输出

 

一行,输出排序结果。

样例输入

7
48 36 68 72 12 48 2

样例输出

2 12 36 48 48 68 72

 

提示

 数据结构A实验四

 

题目来源

CHENZ

 

题目没什么好看的,就是一个数组排序,虽然题目是堆排序,快排、归并之类的都能过。主要是平时不怎么用堆排序,第一次写了一下超时了,囧~,下面贴一个别人的算法。

另外需要注意的是输出格式,行末不能有多余空格,否则A不掉。

 

 1 #include<stdio.h>  
 2 #define SWAP(x, y) {int tmp=x; x=y; y=tmp;}  
 3   
 4 //堆排序
 5 //Author: http://blog.csdn.net/tcherry/article/details/32139911  
 6   
 7 int a[100000];  
 8   
 9 void AdjustDown(int a[], int r, int j)  
10 {  
11     int child = 2*r+1;  
12     int tmp = a[r];  
13     while(child <= j)  
14     {  
15         if(child < j && a[child] < a[child+1]) child ++;  
16         if(tmp >= a[child]) break;  
17         a[(child-1)/2] = a[child];  
18         child = 2*child+1;  
19     }  
20     a[(child-1)/2] = tmp;  
21 }  
22   
23 void heapsort(int a[], int n)  
24 {  
25     for(int i=(n-2)/2;i>-1;i--) AdjustDown(a, i, n-1); // 构造最大堆  
26     for(int i=n-1;i>0;i--)  
27     {  
28         SWAP(a[0], a[i]); // 大的到屁股后面去  
29         AdjustDown(a, 0, i-1);  
30     }  
31 }  
32   
33 int main()  
34 {  
35     int n;  
36     scanf("%d",&n);  
37     for(int i=0;i<n;i++)  
38         scanf("%d",&a[i]);  
39     heapsort(a, n);  
40   
41     for(int i=0;i<n-1;i++)  
42         printf("%d ",a[i]);  
43     printf("%d
",a[n-1]);  
44   
45     return 0;  
46 } 
原文地址:https://www.cnblogs.com/lzjtdxfxl/p/5374615.html