堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:
Heap[0...n-1] 建立成最大堆,此时是无序堆,而堆顶是最大元素Heap[0] 和无序区的最后一个记录 Heap[n-1] 交换,由此得到新的 无序区 Heap[0...n-2] 和 有序区 Heap[n-1],且满足 Heap[0...n-2].keys <= Heap[n-1].keyHeap[1] 可能违反堆性质,故应将当前无序区 Heap[1..n-1] 调整为堆。然后再次将 Heap[1..n-1] 中关键字最大的记录 Heap[1] 和该区间的最后一个记录 Heap[n-1] 交换,由此得到新的无序区 Heap[1..n-2] 和有序区 Heap[n-1..n],且仍满足关系 Heap[1..n-2].keys≤R[n-1..n].keys,同样要将 Heap[1..n-2] 调整为堆。
function heapSort(arr) {// 建堆let size = arr.length;for (let i = Math.floor(size / 2) - 1; i >= 0; i--) {heapify(arr, i, size);}// 堆排序for (let j = size - 1; j >= 1; j--) {// 堆数组中首个元素为值最大元素,与末尾元素交换[arr[0], arr[j]] = [arr[j], arr[0]];// 交换后,再将堆数组中未排序部分进行堆化// 堆化后首个元素又是未排序部分的最大值,下次循环再次交换heapify(arr, 0, --size);}return arr;}// 自上而下堆化function heapify(arr, index, len) {let leftIndex = 2 * index + 1,rightIndex = 2 * index + 2,largest = index;// 左子节点比当前子节点大,则记录左子节点为比较大的节点if (leftIndex < len && arr[leftIndex] > arr[largest]) {largest = leftIndex;}// 右子节点比当前子节点大,则记录右子节点为比较大的节点if (rightIndex < len && arr[rightIndex] > arr[largest]) {largest = rightIndex;}// 最大的节点为非当前字节时if (largest != index) {// 上下交换节点[arr[index], arr[largest]] = [arr[largest], arr[index]];heapify(arr, largest, len);}}