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 }

你可能感兴趣的:(sort)