排序算法-堆排序(含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);
    }
}
相关推荐
啊阿狸不会拉杆几秒前
《计算机视觉:模型、学习和推理》第 4 章-拟合概率模型
人工智能·python·学习·算法·机器学习·计算机视觉·拟合概率模型
ADDDDDD_Trouvaille4 分钟前
2026.2.20——OJ92-94题
c++·算法
宇木灵4 分钟前
C语言基础-四、函数
c语言·开发语言·前端·学习
hansang_IR9 分钟前
【题解】类欧几里得算法
c++·数学·算法·类欧几里得
陈天伟教授9 分钟前
人工智能应用- 人工智能交叉:06.解析蛋白质宇宙
人工智能·神经网络·算法·机器学习·推荐算法
We་ct12 分钟前
LeetCode 114. 二叉树展开为链表:详细解题思路与 TS 实现
前端·数据结构·算法·leetcode·链表·typescript
像素猎人13 分钟前
范围for语法(除for循环/while循环/do...while循环的第四种循环)
数据结构·算法
17 分钟前
2.20进制转化,表达式求值,删除字符
开发语言·c++·算法
追随者永远是胜利者20 分钟前
(LeetCode-Hot100)461. 汉明距离
java·算法·leetcode·职场和发展·go
爱编码的小八嘎22 分钟前
第3章 Windows运行机理-3.1 内核分析(4)
c语言