堆排序

Posted 等风来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆排序相关的知识,希望对你有一定的参考价值。

基本过程

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;
}

 

以上是关于堆排序的主要内容,如果未能解决你的问题,请参考以下文章

选择排序(简单选择排序堆排序的算法思想及代码实现)

排序--08---堆排序

python代码实现堆排序

算法-java代码实现堆排序

一文带你了解堆排序

堆排序