Skip to content

堆排序

简介

堆排序是一种基于堆(通常是最大堆或最小堆)的排序算法。它的时间复杂度为 O(nlogn) 是一个原地排序算法

原地排序算法:排序过程只需要 O(1) 复杂度的空间

代码实现

升序:

ts
function heapSort(nums: number[]): number[] {
    const n = nums.length;

    // 构建最大堆
    for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
        heapify(nums, n, i);
    }

    // 利用最大堆的特性,每次将最大元素移到最后,从而实现升序排序
    for (let i = n - 1; i > 0; i--) {
        [nums[0], nums[i]] = [nums[i], nums[0]];
        heapify(nums, i, 0);
    }

    return nums;
}

function heapify(nums: number[], n: number, i: number): void {
    let largest = i;
    const left = 2 * i + 1;
    const right = 2 * i + 2;

    if (left < n && nums[left] > nums[largest]) {
        largest = left;
    }

    if (right < n && nums[right] > nums[largest]) {
        largest = right;
    }

    if (largest !== i) {
        [nums[largest], nums[i]] = [nums[i], nums[largest]];
        heapify(nums, n, largest);
    }
}

// 测试
const nums = [12, 11, 13, 5, 6, 7];
console.log('排序前:', nums);
heapSort(nums);
console.log('排序后:', nums);

降序:

ts
function heapSort(nums: number[]): number[] {
    const n = nums.length;

    // 构建最小堆
    for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {
        heapify(nums, n, i);
    }

    // 利用最小堆的特性,每次将最小元素移到最后,从而实现降序排序
    for (let i = n - 1; i > 0; i--) {
        [nums[0], nums[i]] = [nums[i], nums[0]];
        heapify(nums, i, 0);
    }

    return nums;
}

function heapify(nums: number[], n: number, i: number): void {
    let least = i;
    const left = 2 * i + 1;
    const right = 2 * i + 2;

    if (left < n && nums[left] < nums[least]) {
        least = left;
    }

    if (right < n && nums[right] < nums[least]) {
        least = right;
    }

    if (least !== i) {
        [nums[least], nums[i]] = [nums[i], nums[least]];
        heapify(nums, n, least);
    }
}

// 测试
const nums = [12, 11, 13, 5, 6, 7];
console.log('排序前:', nums);
heapSort(nums);
console.log('排序后:', nums);

基于 MIT 许可发布