堆排序算法

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    

 

转载于:https://www.cnblogs.com/hellochennan/p/5379155.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值