1 /*
2 *@list:待排序数组
3 *@root:根结点下标
4 *@n:总排序元素个数
5 */
6 void adjust(element list[], int root, int n)//调整最大堆方法一
7 {
8 int child=2*root+1;//左孩子
9 element temp;
10 while(child < n)//***while***
11 {
12 if(child < n-1 && list[child]<list[child+1])//比较左右结点,得到较大的为child
13 {
14 //注意child < n-1
15 child++;
16 }
17
18 if(list[root] > list[child])//比较父节点与较大子节点child
19 {
20 break;
21 }
22 else{
23 /*交换父子节点*/
24 temp = list[root];
25 list[root]=list[child];
26 list[child]=temp;
27
28 /*继续向下,特别要注意这里的*/
29 root=child;
30 child = 2*child +1;
31 }
32 }
33 }
34 void adjust2(element list[], int root, int n)//调整最大堆方法二
35 {
36 int child=2*root+1;//左孩子
37
38 element rootkey=list[root];//标记最初根节点结点
39
40 while(child < n)//***while***
41 {
42 if(child < n-1 && list[child]<list[child+1])
43 {
44 child++;//比较左右结点,得到较大的为child
45 }
46
47 if(rootkey > list[child])//比较最初根节点结点 与 此时的最大子结点
48 {
49 break;
50 }
51 else{
52 //这里不是交换父子结点,和insertSort思想类似
53 list[root]=list[child];//父节点等于较大孩子结点
54
55 //分别向下移动
56 root=child;
57 child = 2*child +1;
58 }
59 }
60 list[root]=rootkey;//找到最初根结点的合适位置
61 }
62
63 /*
64 *@list:待排序数组
65 *@n:总排序元素个数
66 */
67 void heapsort(element list[],int n)//堆排序
68 {
69 int i;
70 element temp;
71
72 /*初始化得到最大堆*/
73 for(i=n/2;i>=0;i--) //从n/2处依次向前调整
74 adjust(list,i,n); //或者采用 adjust2
75
76 for(i=n-1;i>0;i--)//i为剩余规模
77 {
78 temp=list[i]; //交换根结点和i结点
79 list[i]=list[0];
80 list[0]=temp;
81 //或者采用 adjust2
82 adjust(list,0,i);//重新调整,此时参数root为0,规模n为i
83 }
84 }