HDU 1425 sort(堆排序)

题目链接

今天学习排序,冒泡和选择,无视了。。。直接上堆排序。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 1000001
 4 int p[N],n,m;
 5 void heapjust(int x,int len)
 6 {
 7     int i,num;
 8     num = p[x];
 9     for(i = x*2;i <= len;i *= 2)//二叉树的左儿子是2*x右儿子是2*x+1
10     {
11         if(i < len&&p[i] < p[i+1])i ++;//判断左右儿子的大小
12         if(num > p[i]) break;//终止条件如果这个数大,就终止循环。
13         p[x] = p[i];//将大的数替换p[x]
14         x = i;//记录i的值
15     }
16     p[x] = num;//最后将被替换的x记录的i值,给上num的值
17 }
18 void heapbuild()
19 {
20     int i,t;
21     for(i = n/2;i >= 1;i --)
22     {
23         heapjust(i,n);
24     }
25     for(i = n;i >= n-m+1;i --)//堆顶总是最大的元素
26     {
27         t = p[1];
28         p[1] = p[i];
29         p[i] = t;//交换后p[i]存已经排好的顺序
30         heapjust(1,i-1);//重新调整,堆里面所有元素(共有i-1个)
31     }
32 }
33 int main()
34 {
35     int i;
36     while(scanf("%d%d",&n,&m)!=EOF)
37     {
38         for(i = 1;i <= n;i ++)
39         scanf("%d",&p[i]);
40         heapbuild();
41         for(i = n;i >= n-m+1;i --)
42         {
43             if(i == n)
44             printf("%d",p[i]);
45             else
46             printf(" %d",p[i]);
47         }
48         printf("\n");
49     }
50     return 0;
51 }
posted @ 2012-07-21 11:06  Naix_x  阅读(204)  评论(2编辑  收藏  举报