堆排序是一种树形选择排序,通过构造一个二叉堆来实现。以下是 JavaScript 实现堆排序的代码:
function heapSort(arr) {
let len = arr.length;
buildMaxHeap(arr);
for (let i = len - 1; i > 0; i--) {
swap(arr, 0, i);
len--;
maxHeapify(arr, 0, len);
}
return arr;
}
function buildMaxHeap(arr) {
let len = arr.length;
for (let i = Math.floor(len / 2); i >= 0; i--) {
maxHeapify(arr, i, len);
}
}
function maxHeapify(arr, i, len) {
let l = i * 2 + 1;
let r = i * 2 + 2;
let largest = i;
if (l < len && arr[l] > arr[largest]) {
largest = l;
}
if (r < len && arr[r] > arr[largest]) {
largest = r;
}
if (largest != i) {
swap(arr, i, largest);
maxHeapify(arr, largest, len);
}
}
function swap(arr, i, j) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
首先,我们需要把数组堆化,构建大顶堆。这里采用的是从最后一个非叶子节点开始自下而上堆化的方式(从下标为 Math.floor(len/2) 到 0 的节点)。然后,我们通过 swap 函数将堆顶元素与堆尾元素互换位置,并缩小堆的长度。接着,我们再次把数组堆化,得到新的大顶堆。重复上述步骤,直到堆的长度变为 1,此时数组已经有序。