飞鸟各投林

导航

堆排序算法

1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。
好的那么堆得特性是什么呢?
堆得定义:
堆是满足下列性质的数列{r1, r2, …,rn}:
 1 void HeapAdjust (HeapType &H, int s, int m)  
 2 {   // 已知 H.r[s..m]中记录的关键字除 H.r[s] 之外  
 3         //均满足堆的特征,本函数自上而下调整 H.r[s]  
 4         //的关键字,使 H.r[s..m] 也成为一个大顶堆  
 5          rc = H.r[s];    // 暂存 H.r[s]   
 6          for ( j=2*s; j<=m; j*=2 ) 
 7 
 8     { // j 初值指向左孩子  
 9 
10         自上而下的筛选过程;  
11          }  
12          // 自上而下的筛选过程  
13           if ( j<m && H.r[j].key>H.r[j+1].key )  
14                   ++j;       
15                  // 左/右“子树根”之间先进行相互比较  
16                  // 令 j 指示关键字较小记录的位置  
17           if ( rc.key <= H.r[j].key )  
18                  break;   
19                // 再作“根”和“子树根”之间的比较,  
20                // 若“>=”成立,则说明已找到 rc 的插  
21                // 入位置 s ,不需要继续往下调整        
22           H.r[s] = H.r[j];   s = j;      
23             // 否则记录上移,尚需继续往下调整        
24         H.r[s] = rc;  // 将调整前的堆顶记录插入到 s  (注意插入的位置为s j=2*s)  
25 } // HeapAdjust      
26  
27 void HeapSort ( HeapType &H ) {
28   // 对顺序表 H 进行堆排序
29    for ( i=H.length/2;   i>0;   --i )
30      HeapAdjust ( H.r, i, H.length );    // 建小顶堆
31  
32    for ( i=H.length; i>1; --i ) {
33      H.r[1]←→H.r[i];           
34           // 将堆顶记录和当前未经排序子序列
35           //  H.r[1..i]中最后一个记录相互交换
36      HeapAdjust(H.r, 1, i-1);  // 对 H.r[1] 进行筛选
37      }
38 } // HeapSort    

 

posted on 2016-04-11 17:12  飞鸟各投林  阅读(267)  评论(0编辑  收藏  举报