标签:
比赛描述
给定输入排序元素数目n和相应的n个元素,写出程序,利用内排序算法中堆排序算法进行排序,并输出排序最后结果的相应序列。
输入
共两行,第一行给出排序元素数目n,第二行给出n个元素,1≤n≤100000,每个元素值范围为 [0,100000)
输出
一行,输出排序结果。
样例输入
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\n",a[n-1]); 44 45 return 0; 46 }
标签:
原文地址:http://www.cnblogs.com/lzjtdxfxl/p/5374615.html