堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的健值或索引总是小于 (或大于) 它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
- 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
- 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
实现步骤
- 创建一个堆 H[0……n-1];
- 把堆首 (最大值) 和堆尾互换;
- 把队的尺寸缩小为 1,并调用 shift_down(0),目的是把新的数组顶端数据调整到相应位置;
- 重复步骤2,直到堆的尺寸为 1;
动图演示
JavaScript 代码实现
let len;
function buildMaxHeap(arr) {
let = arr.length;
for (let i = Math.floor(len / 2); i >=0; i--) {
heapify(arr, i);
}
}
function heapify(arr, i) {
let left = 2 * i + 1,
right = 2 * i + 2,
largest = i;
if (left < len && arr[left] > arr[largest]) {
largest = left;
}
if (right < len && arr[right] > arr[largest]) {
largest = right;
}
if (largest != i) {
swap(arr, i, largest);
heapify(arr, largest);
}
}
function swap(arr, i, j) {
const temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function heapSort(arr) {
buildMaxHeap(arr);
for (let i = arr.length - 1; i > 0; i--) {
swap(arr, 0, i);
len--;
heapify(arr, 0)
}
return arr;
}