当前位置: 首页 > article >正文

排序算法--堆排序

堆排序是一种高效的排序算法,适合大规模数据排序,尤其适用于需要实时获取最大(或最小)值的场景。

// 交换两个元素的值
void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 调整堆,使其满足堆的性质
void heapify(int arr[], int n, int i) {
    int largest = i; // 初始化最大值的索引为根节点
    int left = 2 * i + 1; // 左子节点
    int right = 2 * i + 2; // 右子节点

    // 如果左子节点大于根节点
    if (left < n && arr[left] > arr[largest]) {
        largest = left;
    }

    // 如果右子节点大于当前最大值
    if (right < n && arr[right] > arr[largest]) {
        largest = right;
    }

    // 如果最大值不是根节点
    if (largest != i) {
        swap(&arr[i], &arr[largest]); // 交换根节点和最大值
        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--) {
        swap(&arr[0], &arr[i]); // 将堆顶元素与当前末尾元素交换
        heapify(arr, i, 0); // 调整剩余部分为最大堆
    }
}
#include <stdio.h>
// 打印数组函数
void printArray(int arr[], int n) {
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {12, 11, 13, 5, 6, 7}; // 待排序数组
    int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度

    printf("排序前的数组: \n");
    printArray(arr, n);

    heapSort(arr, n); // 调用堆排序函数

    printf("排序后的数组: \n");
    printArray(arr, n);

    return 0;
}

优化建议

原地排序:堆排序是原地排序算法,不需要额外空间。

稳定性:堆排序是不稳定的排序算法(相同元素的相对顺序可能改变)。

小规模数据:对于小规模数据,插入排序或选择排序可能更高效。


http://www.kler.cn/a/532319.html

相关文章:

  • ChatGPT提问技巧:行业热门应用提示词案例--咨询法律知识
  • 我主编的电子技术实验手册(24)——RL并联电路
  • 在浏览器中输入baidu.com并按下回车后发生了什么
  • Unity GetLocalizedString()失效问题
  • 基于SpringBoot的新闻资讯系统的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • Kamailio 不通过 dmq 实现注册复制功能
  • C++多线程编程——基于策略模式、单例模式和简单工厂模式的可扩展智能析构线程
  • http请求中的headers和body内容设置
  • 毕业设计:基于深度学习的高压线周边障碍物自动识别与监测系统
  • 如可安装部署haproxy+keeyalived高可用集群
  • 【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.23 稀疏矩阵:CSR格式的存储与运算
  • fiddler笔记
  • 基于Flask的抖音用户浏览行为分析系统的设计与实现
  • RocketMQ实战—3.基于RocketMQ升级订单系统架构
  • Rust 中的模块系统:控制作用域与私有性
  • ThreadLocal使用和原理
  • 【Unity2D 2022:UI】创建滚动视图
  • CTFHub信息泄露PHPINFO
  • Qt展厅播放器/多媒体播放器/中控播放器/帧同步播放器/硬解播放器/监控播放器
  • win32汇编环境,对话框程序生成选项卡(属性页\标签)控件及运用
  • swagger使用指引
  • 网站快速收录:如何优化网站H标签使用?
  • 【操作系统】同步与异步,同步与互斥
  • 【学习笔记】计算机图形学的几何数学基础知识
  • 【Redis】主从模式,哨兵,集群
  • 每日一题——小根堆实现堆排序算法