(笔记)堆排序

堆排序

堆排序是一种高效的排序算法,其时间复杂度为 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) 的排序算法(如快速排序)相比,堆排序的优势在于不需要额外的存储空间,而且最坏情况下的时间复杂度也比较稳定。

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

相关推荐
倒头就睡的小比特7 小时前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!7 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼8 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光9 小时前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark9 小时前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her19 小时前
并查集-听课笔记
笔记·算法·并查集
码流子10 小时前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven10 小时前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark10 小时前
从算法设计模式看编程思维的抽象能力4
算法
2601_9622186110 小时前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法