堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的健值或索引总是小于 (或大于) 它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
- 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;
- 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
实现步骤
- 创建一个堆 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;}
