• 选择排序---堆排序算法(Javascript版) 降序排列


    //调整函数
    function headAdjust(elements, pos, len){
      //将当前节点值进行保存
      var swap = elements[pos];
    
      //定位到当前节点的左边的子节点
      var child = pos * 2 + 1;
    
      //递归,直至没有子节点为止
      while(child < len){
        //如果当前节点有右边的子节点,并且右子节点较小的场合,采用右子节点
        //和当前节点进行比较
        if(child + 1 < len && elements[child] > elements[child + 1]){
          child += 1;
        }
    
        //比较当前节点和最大的子节点,大于则进行值交换,交换后将当前节点定位
        //于子节点上
        if(elements[pos] > elements[child]){
          elements[pos] = elements[child];
          pos = child;
          child = pos * 2 + 1;
        }
        else{
          break;
        }
    
        elements[pos] = swap;
      }
    }
    
    //构建堆
    function buildHeap(elements){
      //从最后一个拥有子节点的节点开始,将该节点连同其子节点进行比较,
      //将最大的数交换与该节点,交换后,再依次向前节点进行相同交换处理,
      //直至构建出小顶堆(升序为大顶,降序为小顶)
      for(var i=elements.length/2; i>=0; i--){
        headAdjust(elements, i, elements.length);
      }
    }
    
    function sort(elements){
      //构建堆
      buildHeap(elements);
    
      //从数列的尾部开始进行调整
      for(var i=elements.length-1; i>0; i--){
        //堆顶永远是最大元素,故,将堆顶和尾部元素交换,将
        //最大元素保存于尾部,并且不参与后面的调整
        var swap = elements[i];
        elements[i] = elements[0];
        elements[0] = swap;
    
        //进行调整,将最大)元素调整至堆顶
        headAdjust(elements, 0, i);
      }
    }
    
    var elements = [3, 1, 5, 7, 2, 4, 9, 6, 10, 8];
    console.log('before: ' + elements);
    sort(elements);
    console.log(' after: ' + elements);

    之前看到堆排序的升序排列,改改成了降序的

    参考原文http://www.cnblogs.com/kongxianghai/p/4004469.html

  • 相关阅读:
    codevs 2010 求后序遍历
    code vs 1013 求先序排列
    codevs 3143 二叉树的序遍历
    codevs 3083 二叉树
    找树的根和孩子
    1501 二叉树最大宽度和高度
    1758:二叉树
    sql 如何把查询得到的结果如何放入一个新表中
    2011的n次方
    计算2的N次方
  • 原文地址:https://www.cnblogs.com/tchlu/p/6002648.html
Copyright © 2020-2023  润新知