堆排序

 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  }
posted @ 2012-07-16 10:15  logzh  阅读(219)  评论(0编辑  收藏  举报