排序算法-堆排序(含C语言代码示例)

一、算法介绍

堆排序是一种基于二叉堆数据结构的排序算法。首先,构建最大堆(或最小堆),将待排序的数组视作一个完全二叉树,通过从最后一个非叶子节点开始向上调整,使得每个父节点的值都大于等于(最大堆)或小于等于(最小堆)其子节点的值。这步骤确保了最大(或最小)值位于堆的根节点。

然后,将堆顶元素(最大值或最小值)与数组的最后一个元素交换位置,并将堆的大小减一。接着,对新的堆顶进行堆调整,使得剩余元素重新满足堆的性质。重复以上步骤,直到堆的大小减至1,即完成排序。

堆排序的时间复杂度为O(n log n),其中n是待排序数组的长度。它具有原地排序的特点,不需要额外的辅助空间,且相对于快速排序等算法,堆排序在最坏情况下也能保持较好的性能。然而,与归并排序相比,堆排序对于稳定性的保持较差,因为在堆调整的过程中可能破坏相同元素之间的相对顺序。

二、代码示例

cpp 复制代码
void swap(int *a, int *b) {
    int temp = *b;
    *b = *a;
    *a = temp;
}

void max_heapify(int index[], int start, int end) {
    int dad = start;
    int son = dad * 2 + 1;
    while (son <= end) {
        if (son + 1 <= end && index[son] < index[son + 1])
            son++;
        if (index[dad] > index[son])
            return;
        else {
            swap(&index[dad], &index[son]);
            dad = son;
            son = dad * 2 + 1;
        }
    }
}

void heap_sort(int index[], int len) {
    int i;
    for (i = len / 2 - 1; i >= 0; i--)
        max_heapify(index, i, len - 1);
    for (i = len - 1; i > 0; i--) {
        swap(&index[0], &index[i]);
        max_heapify(index, 0, i - 1);
    }
}
相关推荐
Allen_LVyingbo15 分钟前
医疗AI多智能体资源调度:用Python构建高性能MCU资源池
开发语言·人工智能·python·算法·知识图谱·健康医疗
叁散17 分钟前
实验项目3 温度传感器
人工智能·算法·机器学习
settingsun122518 分钟前
【AI-算法-02】卷积 Convolution
人工智能·算法
Hcoco_me21 分钟前
大模型面试题48:从白话到进阶详解LoRA 中 r 和 alpha 参数
开发语言·人工智能·深度学习·算法·transformer·word2vec
多米Domi01127 分钟前
0x3f 第24天 黑马web (安了半天程序 )hot100普通数组
数据结构·python·算法·leetcode
Swift社区28 分钟前
LeetCode 468 验证 IP 地址
tcp/ip·算法·leetcode
枫叶丹428 分钟前
【Qt开发】Qt系统(四)-> Qt文件
c语言·开发语言·c++·qt
TDengine (老段)2 小时前
TDengine C/C++ 连接器进阶指南
大数据·c语言·c++·人工智能·物联网·时序数据库·tdengine
黎雁·泠崖3 小时前
栈与队列实战通关:3道经典OJ题深度解析
c语言·数据结构·leetcode
ytttr8739 小时前
隐马尔可夫模型(HMM)MATLAB实现范例
开发语言·算法·matlab