栈就像是一个盛放羽毛球的筒,你最后放进去的球,一定是第一个被拿出来的。
队列就像排队买奶茶,先排队的人先拿到奶茶离开。
在数据结构中,堆是一种特殊的完全二叉树。虽然它是树状结构,但在内存里,我们通常用数组来存储它,因为这样最节省空间且访问效率最高。
大顶堆 (Max Heap):任意节点的值都 >=其子节点的值。堆顶(根节点)永远是最大值。
小顶堆 (Min Heap):任意节点的值都 <= 其子节点的值。堆顶永远是最小值
假设一个节点在数组中的索引为 i,那么:
堆排序是一种利用堆这种数据结构设计的排序算法。它的核心思想是:
这是最核心的函数。当某个节点破坏了堆的性质时,我们要让它“下沉”到合适的位置。
function heapify(arr, n, i) {
let largest = i;
let left = 2 * i + 1;
let right = 2 * i + 2;
// 如果左子节点比父节点大
if (left < n && arr[left] > arr[largest]) {
largest = left;
}
// 如果右子节点比当前最大的还大
if (right < n && arr[right] > arr[largest]) {
largest = right;
}
// 如果最大值不是父节点,则交换并递归调整
if (largest !== i) {
[arr[i], arr[largest]] = [arr[largest], arr[i]];
// 递归调整受影响的子树
heapify(arr, n, largest);
}
}function heapSort(arr) {
const n = arr.length;
// 1. 构建大顶堆 (从最后一个非叶子节点开始)
for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
heapify(arr, n, i);
}
// 2. 逐个提取元素
for (let i = n - 1; i > 0; i--) {
// 将当前堆顶(最大值)移至末尾
[arr[0], arr[i]] = [arr[i], arr[0]];
// 针对剩下的堆空间,重新进行大顶堆化
heapify(arr, i, 0);
}
return arr;
}既是内存管理的物理区域(底层分配),又是逻辑上的数据结构(算法逻辑)。把它们放在一起说,是因为在 JavaScript 的执行环境中,这两者是互为表里、深度耦合的
| 术语 | 作为“数据结构”(算法层面) | 作为“内存空间”(系统层面) |
| 栈 (Stack) | 一种 LIFO(后进先出) 的逻辑模型。你可以用数组模拟它。 | 指的是 调用栈 (Call Stack)。它在内存中是一块连续区域,用来存放函数执行上下文和基本类型。 |
| 堆 (Heap) | 一种 完全二叉树 逻辑模型(如大顶堆)。常用于排序和优先级队列。 | 指的是 堆内存 (Heap Memory)。它是内存中一大块不连续的区域,用来存放对象、数组等大内存数据。 |
根据 ECMAScript 标准,JS 只有以下 8 种内置类型:
而堆、栈、队列是数据结构(逻辑概念)或内存区域(底层实现)
它们是开发者手动实现或引擎内部使用的逻辑。
