zoukankan      html  css  js  c++  java
  • HeapSort

    • 堆排序

    <script type="text/javascript">
    //堆是一种特殊的完全二叉树(使用的是二叉树的顺序存储结构):每个节点的值都大于等于孩子节点的是大顶对
    //小于等于孩子节点的是小顶对
    //排序的思想:将待排的序列构成一个大顶堆,此时把最大值是根节点;
    //把根节点和最后一个元素交换;然后用剩下的n-1个元素继续构建大顶堆,
    //然后继续交换
    //时间复杂度:HeapAdjust()最多执行次数为MAth.floor(LogN)+1次
    //所以时间复杂度为 O(nlogn);
    //空间复杂度:O(1)
    //稳定性:不稳定
    function HeapSort(obj)
    {
      //把待排序的序列构建成大顶推
      for(var i=Math.floor(obj.length/2);i>0;i--)
      {
        HeapAdjust(obj,i,obj.length)
      }
      //交换根节点和最后一个元素的位置
      for(var j=obj.length;j>1;j--)
      {
        swap(obj.data,1,j);
        HeapAdjust(obj,1,j-1);//此处只要调整根节点即可
      }
    }
    //构建大顶堆
    //num代表构建大顶堆的元素的个数
    //s代表有孩子的节点

    function HeapAdjust(obj,s,num)
    {

       var temp=obj.data[s];
      //j<==num;表示当前结点有孩子
      for(var j=2*s;j<=num;j*=2)
      {
        //j<num表示当前节点的两个孩子都存在
        if(j<num && obj.data[j]<obj.data[j+1])
        j=j+1;
        if(temp<obj.data[j])
        {
          obj.data[s]=obj.data[j]
          s=j;
        }else{
          break;
        }
      }
        obj.data[s]=temp;
    }
    //交换数组中两个数的位置
    function swap(arr,i,j)
    {
      var temp;
      temp=arr[j];
      arr[j]=arr[i];
      arr[i]=temp;
    }
    var obj={
        data:[0,3,10,5,11,4,8,9,5],
        length:8
        };
    HeapSort(obj);
    console.log(obj.data);
    </script>

  • 相关阅读:
    2018 ICPC 徐州网络赛
    2018 CCPC网络赛
    2013 NEERC
    2015 Dhaka
    2018ICPC南京网络赛
    Codeforces Round #505
    Codeforces Round #504 E. Down or Right
    Codeforces Round #504 D. Array Restoration
    2018 Multi-University Training Contest 3
    2018 Multi-University Training Contest 2
  • 原文地址:https://www.cnblogs.com/yiluhuakai/p/7684770.html
Copyright © 2011-2022 走看看