三个步骤
(1)用数组创建一个最大堆,用作源数据
(2)将堆中的第一个位置替换为堆的最后一个值,
将堆的大小减 1
(3)将堆的根节点下移,并重复步骤 2
堆排序代码 heapSort
function heapSort(array) {let heapSize = array.length;buildMaxHeap(array); // 步骤 1while (heapSize > 1) {[array[0], array[heapSize - 1]] = [array[heapSize - 1], array[0]];heapSize--;heapify(array, 0, heapSize); // 步骤 3}return array;}
构建最大堆 buildMaxHeap
function buildMaxHeap(array) {
const heapSize = array.length;
for (let i = Math.floor(size / 2); i >= 0; i--) {
heapify(array, i, heapSize);
}
return array;
}
下移 heapify
将当前元素和最大子节点交换
重复这个过程,直到没有做交换为止
function heapify(array, index, heapSize) {
let element = index;
const left = index * 2 + 1,
right = index * 2 + 2;
if (left < heapSize && array[left] > array[element]) {
element = left;
}
if (right < heapSize && array[right] > array[element]) {
element = right;
}
if (index !== element) {
[array[index], array[element]] = [array[element], array[index]];
heapify(array, element, heapSize);
}
}
稳定性
堆排序不稳定
