mydjm

 

堆排序

 1 #include<stdio.h>
2
3 void MaxHeapify(int *a,int i,int len)
4 {//a为数组,i为需要保证最大堆性质的位置,len为数组中要排序的个数
5 int l=2*i;//i的左子女,数组是从1开始的
6 int r=2*i+1;
7 int largest,temp;
8 if((l<=len)&&(a[l]>a[i]))
9 largest = l;
10 else largest = i;
11
12 if((r<=len)&&(a[r]>a[largest]))
13 largest = r;
14
15 if(largest!=i)//最大数不是i
16 {
17 temp = a[i];
18 a[i] = a[largest];
19 a[largest] = temp;
20 MaxHeapify(a,largest,len);
21 }
22 return;
23 }
24
25 void BuildHeap(int *a,int len)//a为数组,len为数组中要排序的个数
26 {
27 int i;
28 for(i=len/2;i>0;i--)
29 MaxHeapify(a,i,len);//自底向上调用MaxHaepify,构造最大堆
30 return;
31 }
32
33 void main()
34 {
35 int a[70],i,temp,len;
36 scanf("%d",&a[0]);//既然数组数据决定从1开始,就用a[0]存储排序数的个数
37 for(i=1;i<=a[0];i++)
38 {
39 scanf("%d",&a[i]);
40 }
41 len = a[0];
42 BuildHeap(a,len);
43 for(i=a[0];i>1;i--)
44 {
45 temp = a[i];
46 a[i] = a[1];
47 a[1] = temp;//交换a[i]和a[1],把最大的数放在最后一个节点
48 len--;//树节点减1,即把最后一个节点断开
49 MaxHeapify(a,1,len);
50 }
51 for(i=1;i<=a[0];i++)
52 printf("%d ",a[i]);
53 return ;
54 }

运行截图:


看懂了算法导论里关于这一章写的,没啥大问题,不过倒是出现了些小问题,比如左右子女我居然写成l=2i;r=2i+1;。。。。

一编译报错了,回去看一纳闷,原来自己在“纸上谈兵”的时候就忘了加"*"号,擦。。这么低级的错误。。

posted on 2012-03-22 08:44  mydjm  阅读(202)  评论(0编辑  收藏  举报

导航