每天学习一个小算法:堆排序

堆排序


算法原理

堆排序利用二叉堆(大顶堆)的特性实现排序:

  1. 建堆:把数组构建成一个大顶堆,堆顶为最大值。
  2. 交换:将堆顶与末尾元素交换,固定最大值。
  3. 堆化:对剩余元素重新调整为堆,重复直到全部有序。

一、适用场景

  • 大数据量排序,性能稳定 O(n log n)
  • 内存紧张场景(无需额外空间)
  • 求 Top K 问题(如最大/最小前 K 个)
  • 不要求稳定性的工业级排序场景
  • 嵌入式、底层系统优先选择

二、复杂度分析

1.时间复杂度

  • 最好时间复杂度:O(n log n)
  • 平均时间复杂度:O(n log n)
  • 最坏时间复杂度:O(n log n)

2.空间复杂度

空间复杂度:O(1)

三、代码实现

1、Python实现

python 复制代码
# 堆排序 Python 实现
def heapify(arr, n, i):
    largest = i
    l = 2 * i + 1
    r = 2 * i + 2

    if l < n and arr[l] > arr[largest]:
        largest = l
    if r < n and arr[r] > arr[largest]:
        largest = r

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)
    for i in range(n//2 - 1, -1, -1):
        heapify(arr, n, i)

    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)
    return arr

2、Java实现

java 复制代码
// 堆排序 Java 实现
public static 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);
    }
}

public static 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);
    }
}

3、C语言实现

c 复制代码
// 堆排序 C 语言实现
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);
    }
}

void heapSort(int arr[], int n) {
    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);
    }
}

总结

记录自己的快乐学习日志,也祝贺观看到这的小伙伴早日学有所成,财富自由💰💰。

记得点赞👍、收藏👋呀!!!

相关推荐
是main不是漫1 小时前
【双指针——移动零】数组划分类题目的入门基石
c++·算法
Nuanyt1 小时前
Agent 学习笔记(下篇三):上线工程、进阶选择与操作界面(Stage 7 / 7.5 / 8 + 延伸路线)
笔记·python·学习·memory·aiagent·harness
深圳市快瞳科技有限公司2 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
叼烟扛炮2 小时前
Linux 学习笔记(四十一):TCP 并发演进——从单进程到多线程服务器
linux·运维·服务器·网络·笔记·学习·tcp/ip
叼烟扛炮3 小时前
Linux 学习笔记(四十四):HTTP 协议解析与极简 Web 服务器实战
linux·服务器·学习
songyuc3 小时前
【Manskill3】TableSceneBuilder学习笔记
pytorch·笔记·学习
专注仿真4 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
小豆庄4 小时前
视频遮罩追踪退场后ID撞号的排查—多目标场景下的失效
opencv·算法·bug·视频·python3.11
外收内放4 小时前
Python基础语法练习题(75)
开发语言·python·学习
Tisfy4 小时前
LeetCode 3882.网格图中最小异或路径:动态规划
算法·leetcode·动态规划