码迷,mamicode.com
首页 > 编程语言 > 详细

堆排序

时间:2016-12-11 23:14:50      阅读:282      评论:0      收藏:0      [点我收藏+]

标签:调整   倒数   bsp   堆排序   java   堆排   bre   实现   sort   

基本过程

1.将无序数组转换为一个大顶堆
2.将大顶堆的顶部元素与数组的最后一个元素交换
3.将交换后的堆调整为一个大顶堆
4.将堆顶与数组倒数第二个元素交换
5.重复以上过程,直至堆中只有一个元素

堆排序实际上也是一种选择排序,只是从前面的元素中选取最大元素的方法是使用堆选取,
比直接比较选取节省比较次数。

javascript实现

function fHeapSort(arr){
    //构建初始堆,将无序数组转化为堆
    var len = arr.length;
    for(var i=len/2 -1;i >=0;i--){
        fAdjustHeap(arr,i,len);
    }
    for(var i=len-1;i>0;i--){
        //将堆顶与数组的第i个元素交换
        var temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        //交换后,重新构造大顶堆
        fAdjustHeap(arr,0,i);
    }
}

function fAdjustHeap(arr,nParent,len){
    //从父节点,左孩子,右孩子三个节点中选取最大者,与父节点交换,
    //对于子节点非孩子节点,与父节点交换后,其自身的大顶堆可能被破坏,
    //需要向下继续调整,直至到达堆边界,即叶子节点
    var temp = arr[nParent];
    var nChild = 2 * nParent + 1;
    while(nChild < len){
        //nChild + 1为右侧孩子节点,若右孩子大,则选择它
        if(nChild + 1 < length && arr[nChild] < arr[nChild + 1]){
            nChild++;
        }
        //若父节点大,则无需交换
        if(temp >= arr[nChild]){
            break;
        }
        //将大孩子赋值给父节点
        arr[nParent] = arr[nChild];
        nParent = nChild;
        //索引向叶子节点前进
        nChild = 2 * nParent + 1;
    }   
    arr[nParent] = temp;
}

 

堆排序

标签:调整   倒数   bsp   堆排序   java   堆排   bre   实现   sort   

原文地址:http://www.cnblogs.com/mengff/p/6160874.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!