排序算法-堆排序(含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);
    }
}
相关推荐
拂拉氏42 分钟前
【知识讲解】 链式哈希表的实现与unordered_map和unordered_set的封装
数据结构·哈希算法·散列表
haolin123.1 小时前
数据结构--二叉树
数据结构
tkevinjd1 小时前
力扣148-排序链表
算法·leetcode·链表
不如语冰1 小时前
AI大模型入门-参数的传递
数据结构·人工智能·pytorch·python
qeen871 小时前
【C++】vector的模拟实现详解(二)
c++·学习·算法·迭代器·stl
流浪0011 小时前
数据结构篇(四):线性表——链表——双链表
数据结构·链表
代码雕刻家1 小时前
编程语法细节
java·c语言·开发语言
草莓熊Lotso2 小时前
【Linux网络】深入理解Linux IO多路复用:从本质到select服务器实战
linux·运维·服务器·c语言·网络·数据库·c++
小七在进步2 小时前
数据结构:堆排序
数据结构
沉迷学习 日益消瘦3 小时前
4 净资产趋势可视化:SVG 图表 + 手势交互 + 降采样算法
算法·交互