三个步骤

(1)用数组创建一个最大堆,用作源数据

(2)将堆中的第一个位置替换为堆的最后一个值,
将堆的大小减 1

(3)将堆的根节点下移,并重复步骤 2

堆排序代码 heapSort

  1. function heapSort(array) {
  2. let heapSize = array.length;
  3. buildMaxHeap(array); // 步骤 1
  4. while (heapSize > 1) {
  5. [array[0], array[heapSize - 1]] = [array[heapSize - 1], array[0]];
  6. heapSize--;
  7. heapify(array, 0, heapSize); // 步骤 3
  8. }
  9. return array;
  10. }

构建最大堆 buildMaxHeap

function buildMaxHeap(array) {
    const heapSize = array.length;
    for (let i = Math.floor(size / 2); i >= 0; i--) {
        heapify(array, i, heapSize);
    }
    return array;
}

下移 heapify

将当前元素和最大子节点交换
重复这个过程,直到没有做交换为止

function heapify(array, index, heapSize) {
    let element = index;
    const left = index * 2 + 1,
        right = index * 2 + 2;
    if (left < heapSize && array[left] > array[element]) {
        element = left;
    }
    if (right < heapSize && array[right] > array[element]) {
        element = right;
    }
    if (index !== element) {
        [array[index], array[element]] = [array[element], array[index]];
        heapify(array, element, heapSize);
    }
}

稳定性

堆排序不稳定