打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
堆排序算法 总结

最近面试,老是被问到堆排序算法。
回答时老是感觉思路不清楚,现在总结一下,把思路弄清楚的。

1.堆排序是利用堆的特性对记录序列进行排序的一种排序方法。
好的那么堆得特性是什么呢?
堆得定义:
堆是满足下列性质的数列{r1, r2, …,rn}:

 

如下图最开始是一个小顶堆。当把97和13 交换后不是堆了,所以我们要调整根节点使之成为堆即筛选。(注意:是自堆顶到叶子的筛选过程,应该刚开始是堆由于把堆顶给换了,罪魁祸首是堆顶,其它小范围还是堆,所以是从堆顶开始)。

这其中还要注意一点。97 与13 交换后应该跟27 比较为什么呢?
1.因为是小顶堆,所以在97 的子节点里选择小者。如果把38放上去。38成了27的父节点比27大就不是小顶堆了。如果换成大顶堆就要比较把大的数据放上去。
所以程序里交换时要先要比较一下。
程序如下:
  1. //堆调整算法  
  2. void HeapAdjust (HeapType &H, int s, int m)  
  3. {   // 已知 H.r[s..m]中记录的关键字除 H.r[s] 之外  
  4.     //均满足堆的特征,本函数自上而下调整 H.r[s]  
  5.     //的关键字,使 H.r[s..m] 也成为一个大顶堆  
  6.      rc = H.r[s];    // 暂存 H.r[s]   
  7.      for ( j=2*s; j<=m; j*=2 ) { // j 初值指向左孩子  
  8.     自上而下的筛选过程;  
  9.      }  
  10.      // 自上而下的筛选过程  
  11.       if ( j<m && H.r[j].key>H.r[j+1].key )  ++j;       
  12.              // 左/右“子树根”之间先进行相互比较  
  13.              // 令 j 指示关键字较小记录的位置  
  14.       if ( rc.key <= H.r[j].key )  break;   
  15.            // 再作“根”和“子树根”之间的比较,  
  16.            // 若“>=”成立,则说明已找到 rc 的插  
  17.            // 入位置 s ,不需要继续往下调整  
  18.   
  19.       H.r[s] = H.r[j];   s = j;      
  20.         // 否则记录上移,尚需继续往下调整  
  21.   
  22.     H.r[s] = rc;  // 将调整前的堆顶记录插入到 s  (注意插入的位置为s j=2*s)  
  23. } // HeapAdjust  

2)建堆是一个从下往上进行“筛选”的过程 (首先要把底部的建成小堆,前面调整是因为只有堆顶,其它都已经是堆了。当我建堆到堆顶是也是从堆顶往下筛选)(所以说建堆大范围是从下往上筛选,在添加该结点时,还得从该节点往下筛选确保添加该节点后还是堆)。
如下图建堆过程:  从97 开始->65->38 ->49这是从下往上(大范围从下往上)。第二个图到65时又 65与13 调整了(从上往下调整)。当到49时也是49<-> 13  <-> 27所以也是从上之下调整(为了确保加入该结点后还是堆)。



程序如下:
堆排序算法如下:
  1. void HeapSort ( HeapType &H ) {  
  2.   // 对顺序表 H 进行堆排序  
  3. for ( i=H.length/2;   i>0;   --i )  
  4.      HeapAdjust ( H.r, i, H.length );    // 建小顶堆  
  5.   
  6. for ( i=H.length; i>1; --i ) {  
  7.      H.r[1]←→H.r[i];             
  8.           // 将堆顶记录和当前未经排序子序列  
  9.           //  H.r[1..i]中最后一个记录相互交换  
  10.      HeapAdjust(H.r, 1, i-1);  // 对 H.r[1] 进行筛选  
  11. }  
  12. } // HeapSort  

note: 堆排序算法以前看过几遍老是忘,问得时候思路不太清晰。只要把关键几个点弄清楚,把思路搞清楚了以后就不怕了。







本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
9.7.1 堆排序算法(1)
八种排序算法总结(4)
七大常见排序算法总结
Java实现常见排序算法(二)
堆排序
知识分享:数据结构常用 7 种排序算法(无基数排序),建议收藏
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服