zoukankan      html  css  js  c++  java
  • 堆排序算法 总结

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

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

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

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

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



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

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







  • 相关阅读:
    【注册验证】 控制器(添加数据+后台验证)
    AJAX 简介
    我的博客生涯
    windows xp sp3 下载地址
    get、set、add、remove → (字段、属性)+(委托、事件)
    ArcObjects整体介绍
    委托
    对字符串的处理的又一个强大的工具,正则表达式
    对象序列化存在的原因
    关于文件操作的几个类
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4532947.html
Copyright © 2011-2022 走看看