堆排序

堆排序利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树,分为最大堆和最小堆。最大堆中,父节点的值总是大于或等于其子节点的值;最小堆中,父节点的值总是小于或等于其子节点的值。堆排序一般使用最大堆来实现升序排序,使用最小堆来实现降序排序。

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

  1. 构建堆:将数组构建成一个最大堆。
  2. 交换和重建堆:将堆顶元素(最大值)与堆的最后一个元素交换,减小堆的大小并重新构建堆,直到堆的大小为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;
// 先构建最大堆
// n 是最后一个节点
// n 的上一层 n/2
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);

堆排序
https://zhaops-hub.github.io/2021/12/09/排序算法/堆排序/
作者
赵培胜
发布于
2021年12月9日
许可协议