(笔记)堆排序

堆排序

堆排序是一种高效的排序算法,其时间复杂度为 O(nlogn),其中 n 是要排序的元素数量。堆排序的核心思想是利用堆这种数据结构来实现排序操作。

算法步骤

  1. 将待排序序列构造成一个大顶堆。具体来说,从最后一个非叶子节点开始,对每个非叶子节点进行调整,使其满足大顶堆的性质,即父节点的值大于其左右子节点的值。
  2. 依次将堆顶元素(最大值)取出,放到待排序序列的末端,然后对剩余的堆进行调整,使其重新满足大顶堆的性质。
  3. 重复步骤 2 直到待排序序列中的所有元素都被取出。

代码实现

下面是使用 Java 实现堆排序的代码:

复制代码
public void heapSort(int[] arr) {
    int n = arr.length;
    for (int i = n / 2 - 1; i >= 0; i--) {
        heapify(arr, n, i);
    }
    for (int i = n - 1; i >= 0; i--) {
        int temp = arr[0];
        arr[0] = arr[i];
        arr[i] = temp;
        heapify(arr, i, 0);
    }
}

private void heapify(int[] arr, int n, int i) {
    int largest = i;
    int l = 2 * i + 1;
    int r = 2 * i + 2;
    if (l < n && arr[l] > arr[largest]) {
        largest = l;
    }
    if (r < n && arr[r] > arr[largest]) {
        largest = r;
    }
    if (largest != i) {
        int temp = arr[i];
        arr[i] = arr[largest];
        arr[largest] = temp;
        heapify(arr, n, largest);
    }
}

使用场景

堆排序适用于需要对大规模数据进行排序的场景,例如排序 10 万个整数。与其他 O(nlogn) 的排序算法(如快速排序)相比,堆排序的优势在于不需要额外的存储空间,而且最坏情况下的时间复杂度也比较稳定。

需要注意的是,堆排序不适用于排序少量数据的场景,因为其时间复杂度常数比较大,不如插入排序、选择排序等简单排序算法。另外,在实际应用中,堆排序的常数因子比较大,常被其他排序算法所取代。

相关推荐
夜思红尘1 小时前
算法--双指针
python·算法·剪枝
散峰而望2 小时前
【算法竞赛】C++函数详解:从定义、调用到高级用法
c语言·开发语言·数据结构·c++·算法·github
CoderCodingNo2 小时前
【GESP】C++五级真题(贪心思想考点) luogu-B4071 [GESP202412 五级] 武器强化
开发语言·c++·算法
我有一些感想……2 小时前
An abstract way to solve Luogu P1001
c++·算法·ai·洛谷·mlp
前端小L2 小时前
双指针专题(三):去重的艺术——「三数之和」
javascript·算法·双指针与滑动窗口
智者知已应修善业3 小时前
【求等差数列个数/无序获取最大最小次大次小】2024-3-8
c语言·c++·经验分享·笔记·算法
LYFlied3 小时前
【每日算法】LeetCode 416. 分割等和子集(动态规划)
数据结构·算法·leetcode·职场和发展·动态规划
多米Domi0114 小时前
0x3f 第19天 javase黑马81-87 ,三更1-23 hot100子串
python·算法·leetcode·散列表
历程里程碑4 小时前
滑动窗口最大值:单调队列高效解法
数据结构·算法·leetcode
量子炒饭大师4 小时前
Cyber骇客的逻辑节点美学 ——【初阶数据结构与算法】二叉树
c语言·数据结构·c++·链表·排序算法