堆排序利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树,分为最大堆和最小堆。最大堆中,父节点的值总是大于或等于其子节点的值;最小堆中,父节点的值总是小于或等于其子节点的值。堆排序一般使用最大堆来实现升序排序,使用最小堆来实现降序排序。
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
- 构建堆:将数组构建成一个最大堆。
- 交换和重建堆:将堆顶元素(最大值)与堆的最后一个元素交换,减小堆的大小并重新构建堆,直到堆的大小为1。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| function heapify(arr, n, i) { let largest = i; let left = 2 * i + 1; let right = 2 * i + 2;
if (left < n && arr[left] > arr[largest]) { largest = left; }
if (right < n && arr[right] > arr[largest]) { largest = right; }
if (largest != i) { let temp = arr[largest]; arr[largest] = arr[i]; arr[i] = temp; heapify(arr, n ,largest) } }
function createHeap1(arr) { let n = arr.length; for (let i = n / 2 - 1; i >= 0; i--) { heapify(arr, n, i) }
for (let i = n - 1; i > 0; i--) { let temp = arr[0]; arr[0] = arr[i]; arr[i] = temp;
heapify(arr, i, 0) }
}
let arr = [12, 13, 11, 5, 6, 7]; createHeap1(arr) console.log(arr);
|