(笔记)堆排序

堆排序

堆排序是一种高效的排序算法,其时间复杂度为 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 天前
力扣81. 搜索旋转排序数组 II
算法·leetcode·职场和发展
报错小能手1 天前
刷题日常 5 二叉树最大深度
算法
Greedy Alg1 天前
LeetCode 84. 柱状图中最大的矩形(困难)
算法
im_AMBER1 天前
Leetcode 52
笔记·学习·算法·leetcode
小欣加油1 天前
leetcode 946 验证栈序列
c++·算法·leetcode·职场和发展
包饭厅咸鱼1 天前
PaddleOCR----制作数据集,模型训练,验证 QT部署(未完成)
算法
无敌最俊朗@1 天前
C++ 并发与同步速查笔记(整理版)
开发语言·c++·算法
王哈哈^_^1 天前
【完整源码+数据集】课堂行为数据集,yolo课堂行为检测数据集 2090 张,学生课堂行为识别数据集,目标检测课堂行为识别系统实战教程
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测·毕业设计
夏鹏今天学习了吗1 天前
【LeetCode热题100(66/100)】寻找两个正序数组的中位数
算法·leetcode·职场和发展