美文网首页
JavaScript - 排序算法 - 堆排序

JavaScript - 排序算法 - 堆排序

作者: ElricTang | 来源:发表于2020-10-22 14:14 被阅读0次

特点:

  • 时间复杂度:O(nlog2n)
  • 堆排序是不稳定的排序算法

原理:

  • 利用大顶堆排序(升序)
  • 利用小顶堆排序(降序)
  • 初始时将待排序数组生成堆结构
  • 将堆顶换到堆尾,并取出放入结果集
  • 重新维护堆结构,获取下一个堆顶,重复上述操作
  • 当堆被清空,排序完成

代码实现:

  • 堆排序的核心在于维护堆结构,并实现一个重置堆的方法(heapify)。
    1. 使用数组存储堆结构(使用树结构同样可以,但是浪费空间)
      重要性质:节点关系与数组index的映射关系
parent(i) = floor((i - 1)/2)
left(i)   = 2i + 1
right(i)  = 2i + 2
// 数据结构-最大堆
let heap = [];

// utils,交换位置
function swap(index1, index2) {
    [heap[index1], heap[index2]] = [heap[index2], heap[index1]];
}

// 上浮shiftUp,维护堆的属性
function shiftUp(index) {
    let fatherIndex = Math.floor((index - 1) / 2);

    if (index !== 0 && heap[fatherIndex] < heap[index]) {
        swap(fatherIndex, index);
        shiftUp(fatherIndex);
    }
}

// 下沉shiftDown,也被称为堆化
function shiftDown(index) {
    // 判断是否比子节点小
    let leftChild = index * 2 + 1;
    let rightChild = index * 2 + 2;

    if (leftChild < heap.length && heap[index] < heap[leftChild]) {
        swap(index, leftChild);
        shiftDown(leftChild);
    }
    if (rightChild < heap.length && heap[index] < heap[rightChild]) {
        swap(index, rightChild);
        shiftDown(rightChild);
    }
}

function heapSort(arr) {
    // 建堆
    for (let i of arr) {
        heap.push(i);
        shiftUp(heap.length - 1);
    }
    let res = [];

    while (heap.length > 0) {
        swap(0, heap.length - 1);
        res.push(heap.pop());
        shiftDown(0);
    }
    return res;
}

相关文章

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • JavaScript实现经典排序算法

    使用JavaScript实现的经典排序算法 util 冒泡 简单选择 直接插入 快速排序 堆排序 归并排序

  • 堆排序

    转载:图解排序算法(三)之堆排序 预备知识 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选...

  • 排序算法-堆排序

    参考: Java排序算法(五):堆排序 【算法与数据结构】图说堆排序 【数据结构】排序算法:希尔、归并、快速、堆排...

  • 数据结构与算法

    常见排序算法 堆排序 算法大全 算法大汇总

  • JavaScript - 排序算法 - 堆排序

    特点: 时间复杂度:O(nlog2n) 堆排序是不稳定的排序算法 原理: 利用大顶堆排序(升序) 利用小顶堆排序(...

  • 数据结构

    Q:堆排序 A:1 堆排序算法(图解详细流程)2 堆排序 Q:排序算法时间复杂度与稳定性 选择排序为什么不稳定:举...

  • web开发需要知道的几个算法

    算法分类 快速排序算法 深度优先算法 广度优先算法 堆排序算法 归并排序算法

  • 2018-06-30

    排序算法之堆排序 堆排序是利用堆的数据结构而设计的一种排序算法,堆排序是一种选择排序。可以利用数组的特点快速定位制...

  • 堆排序算法思想

    前两天看了看堆排序算法,啃了半天的书,最后搞明白了堆排序算法,今天有时间给大家说说这个堆排序算法。首先讲一下算法的...

网友评论

      本文标题:JavaScript - 排序算法 - 堆排序

      本文链接:https://www.haomeiwen.com/subject/idwumktx.html