堆排序

85 阅读1分钟

定义

堆其实就是满足一定条件的树在堆中,他的每个结点的值都大于等于(或者小于等于)子树中的所有结点的值。 也可以通俗的说任意一个节点的值都大于等于(或者小于等于)所有所有子节点的值; 大顶推:所有节点都大于等于它的两个子节点;
小顶堆:所有节点都小于等于它的两个子节点;

示例

image.png

实现(大顶堆)

const heapSort = (arr: number[]): void =>{
    // 构建最大堆
    let n = arr.length;
    for(let i = Math.floor(n / 2 - 1); i >= 0; i--) {
        heapify(arr, n, i); // 把下标为i的节点放到合适的位置上
    }
 
    while(n > 1) {
        // 交换堆顶元素和堆尾元素
        [arr[0], arr[n - 1]] = [arr[n - 1], arr[0]];
        // 堆的个数减一
        n--;
        // 把堆顶元素放到合适的位置
        heapify(arr, n, 0);
    }
}
 
const heapify = (arr: number[], n: number, i: number): void =>{
    let largestIndex = i;
    let leftIndex = 2 * i + 1;
    let rightIndex = 2 * i + 2;
 
    if(leftIndex < n && arr[leftIndex] > arr[largestIndex]) {
        largestIndex = leftIndex;
    }
    if(rightIndex < n && arr[rightIndex] > arr[largestIndex]) {
        largestIndex = rightIndex;
    }
    if(largestIndex !== i) {
        [arr[i], arr[largestIndex]] = [arr[largestIndex], arr[i]];
        heapify(arr, n, largestIndex);
    }
}