当前位置:首页 > JavaScript

js 堆实现

2026-02-01 03:49:52JavaScript

堆(Heap)简介

堆是一种特殊的完全二叉树,分为最大堆(父节点值大于等于子节点)和最小堆(父节点值小于等于子节点)。常用于实现优先队列、堆排序等场景。

堆的实现关键点

  1. 存储结构:通常用数组表示堆,索引从0或1开始。父子节点关系可通过索引计算:

    • 父节点索引:Math.floor((i - 1) / 2)(0-based)
    • 左子节点索引:2 * i + 1
    • 右子节点索引:2 * i + 2
  2. 核心操作

    js 堆实现

    • 插入(Insert):将新元素添加到末尾,然后向上调整(heapifyUp)。
    • 删除堆顶(Extract):将堆顶与末尾交换,删除末尾,然后向下调整(heapifyDown)。
    • 堆化(Heapify):从最后一个非叶子节点开始向前调整。

JavaScript 最小堆实现代码

class MinHeap {
  constructor() {
    this.heap = [];
  }

  // 获取父节点索引
  getParentIndex(i) {
    return Math.floor((i - 1) / 2);
  }

  // 获取左子节点索引
  getLeftChildIndex(i) {
    return 2 * i + 1;
  }

  // 获取右子节点索引
  getRightChildIndex(i) {
    return 2 * i + 2;
  }

  // 交换元素
  swap(i, j) {
    [this.heap[i], this.heap[j]] = [this.heap[j], this.heap[i]];
  }

  // 向上调整
  heapifyUp(index) {
    while (index > 0 && this.heap[index] < this.heap[this.getParentIndex(index)]) {
      const parentIndex = this.getParentIndex(index);
      this.swap(index, parentIndex);
      index = parentIndex;
    }
  }

  // 向下调整
  heapifyDown(index) {
    const leftChildIndex = this.getLeftChildIndex(index);
    const rightChildIndex = this.getRightChildIndex(index);
    let smallest = index;

    if (leftChildIndex < this.heap.length && this.heap[leftChildIndex] < this.heap[smallest]) {
      smallest = leftChildIndex;
    }

    if (rightChildIndex < this.heap.length && this.heap[rightChildIndex] < this.heap[smallest]) {
      smallest = rightChildIndex;
    }

    if (smallest !== index) {
      this.swap(index, smallest);
      this.heapifyDown(smallest);
    }
  }

  // 插入元素
  insert(value) {
    this.heap.push(value);
    this.heapifyUp(this.heap.length - 1);
  }

  // 删除堆顶
  extractMin() {
    if (this.heap.length === 0) return null;
    const min = this.heap[0];
    this.heap[0] = this.heap.pop();
    this.heapifyDown(0);
    return min;
  }

  // 获取堆顶
  peek() {
    return this.heap[0] || null;
  }

  // 构建堆(从无序数组)
  buildHeap(arr) {
    this.heap = [...arr];
    for (let i = Math.floor(this.heap.length / 2) - 1; i >= 0; i--) {
      this.heapifyDown(i);
    }
  }
}

使用示例

const heap = new MinHeap();
heap.insert(3);
heap.insert(1);
heap.insert(4);
console.log(heap.extractMin()); // 输出 1
console.log(heap.peek()); // 输出 3

// 构建堆示例
const heap2 = new MinHeap();
heap2.buildHeap([5, 3, 8, 1, 2]);
console.log(heap2.extractMin()); // 输出 1

时间复杂度

  • 插入(Insert):O(log n)
  • 删除堆顶(Extract):O(log n)
  • 构建堆(BuildHeap):O(n)(通过Floyd算法优化)

标签: js
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…