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>

posted @ 2017-10-18 00:20  Skd一路花开  阅读(115)  评论(0编辑  收藏  举报