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

堆排序


算法原理

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

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

总结

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

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

相关推荐
浅念-19 小时前
递归解题指南:LeetCode经典题全解析
数据结构·算法·leetcode·职场和发展·排序算法·深度优先·递归
Kiling_070419 小时前
Java集合进阶:Set与Collections详解
算法·哈希算法
智者知已应修善业20 小时前
【51单片机89C51及74LS273、74LS244组成】2022-5-28
c++·经验分享·笔记·算法·51单片机
·醉挽清风·20 小时前
学习笔记—MySQL—库表操作
笔记·学习·mysql
洛水水20 小时前
【力扣100题】33.验证二叉搜索树
算法·leetcode·职场和发展
SimpleLearingAI20 小时前
聚类算法详解
算法·数据挖掘·聚类
刀法如飞21 小时前
Go 字符串查找的 20 种实现方式,用不同思路解决问题
算法·面试·程序员
白小沫21 小时前
TortoiseSVN是什么?
学习
weixin_451431561 天前
【学习笔记】微博视频页面ajax请求与响应数据分析
笔记·学习·音视频
清辞8531 天前
尾盘选股法程序开发学习初期
学习