欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS--排序算法之堆排序

程序员文章站 2022-03-26 14:34:36
排序算法之堆排序 [Toc] 什么是堆? + 堆是一颗完全二叉树 + 堆分为 最大堆和最小堆 + 最大堆父节点都大于子节点, 最小堆父节点都小于子节点 + 左子节点: 2 i +1 (i: 父节点index) + 右子节点: 2 i+2 堆排序 利用最大堆实现升序, 最小堆实现降序. 因为最大堆的根 ......

排序算法之堆排序

目录

什么是堆?

  • 堆是一颗完全二叉树
  • 堆分为 最大堆和最小堆
  • 最大堆父节点都大于子节点, 最小堆父节点都小于子节点
  • 左子节点: 2*i +1 (i: 父节点index)
  • 右子节点: 2*i+2

堆排序

利用最大堆实现升序, 最小堆实现降序. 因为最大堆的根父节点一定是最大的, 让它和队尾元素互换, 然后在从堆中排除最后一个元素, 并复原最大堆. 循环 n-1次.

关键在于构建最大堆

最大堆的构建过程

JS--排序算法之堆排序

  • 时间复杂度: o(n*log(n))
  • 不稳定的排序
  • 特征: 找出最大的元素放在末尾(升序)
    function heapsort(ary) {
        // 实现最大堆
        // start: 父节点, end: 循环深度
        function maxheap(ary, start, end) {
            let parent = start, // 父节点
                son = parent*2 + 1, // 左子节点
                temp = null;
            // 规定循序最大深度
            while(son<=end) {
                // 如果存在右子节点, 并且判断右节点是否大于左节点
                if(son+1<=end && ary[son] < ary[son+1]) son++;
                if(ary[son] > ary[parent]) {
                    temp = ary[son];
                    ary[son] = ary[parent];
                    ary[parent] = temp;
                    parent = son;
                    son = parent*2 +1;
                }else {
                    return;
                }
            }
        }
        // 构建最大堆  ary.length/2-1: 表示最后一个父节点
        for(let i = ary.length/2-1; i>=0; i--) {
            maxheap(ary, i, ary.length-1);
        }
        // 排序
        for(let i = ary.length-1; i>0; i--) {
            let temp = ary[0];
            ary[0] = ary[i];
            ary[i]= temp;
            // 剔除最后一个元素,并复原最大堆
            maxheap(ary, 0, i-1);
        }
        return ary;
    }

效果演示:

JS--排序算法之堆排序