考研数据结构——C语言实现小顶堆

  1. 数组初始化

    • 首先,我们有一个整数数组arr,里面包含了一系列需要排序的数字。
    • 数组的长度n是通过对数组arr的总字节大小除以单个元素的字节大小得到的。
  2. 小顶堆调整函数

    • adjustHeapMin函数的作用是将数组中的元素从某个节点向下调整,以满足小顶堆的性质。在小顶堆中,父节点的值总是大于或等于子节点的值。
    • 函数从索引i的元素开始,将其与它的子节点(索引k)进行比较。
    • 如果子节点的值小于当前节点的值,并且子节点的值小于父节点的值,那么将子节点的值上移,即与父节点交换位置。
    • 这个过程一直进行,直到当前节点的值不再小于其子节点的值,或者已经到达数组的末尾(叶子节点)。
  3. 交换函数

    • swap函数是一个简单的辅助函数,用于交换数组中两个元素的位置。
  4. 堆排序函数

    • heapsortMin函数是堆排序的核心,它首先通过调用adjustHeapMin函数将整个数组构建成一个小顶堆。
    • 然后,它将堆顶元素(最小元素)与数组末尾的元素交换位置,这样数组的末尾就包含了一个有序的元素。
    • 交换后,数组的长度减少,因为最后一个元素已经是有序的了。
    • 接着,函数再次调用adjustHeapMin来重新调整堆的结构,确保除了最后一个元素之外的部分仍然是一个小顶堆。
    • 这个过程重复进行,直到整个数组都变为有序。
  5. 主函数

    • main函数是程序的入口点,它调用heapsortMin函数来对数组进行排序。
    • 排序完成后,通过一个循环遍历数组并打印出排序后的结果。

总结: 这段代码通过构建小顶堆,然后不断调整堆结构并交换堆顶元素与末尾元素,实现了数组的排序。这个过程是递归的,每次交换后都会减少堆的大小,并重新调整堆以保持小顶堆的性质。最终,数组中的元素将按照从小到大的顺序排列。

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int arr[] = { 12,4,132,55,46,232,789,1,0,98,523,666 };
int n = sizeof(arr) / sizeof(arr[0]);

// 调整为小顶堆
void adjustHeapMin(int i, int lef) {
    int temp = arr[i];
    int k;
    for (k = i * 2 + 1; k < lef; k = k * 2 + 1) {
        if (k + 1 < lef && arr[k] > arr[k + 1]) {
            k++;
        }
        if (arr[k] < temp) {
            arr[i] = arr[k];
            i = k;
        }
        else {
            break;
        }
    }
    arr[i] = temp;
}

void swap(int a, int b) {
    int temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
}

// 小顶堆排序
void heapsortMin() {
    // 构建小顶堆
    for (int i = n / 2 - 1; i >= 0; i--) {
        adjustHeapMin(i, n);
    }
    // 调整堆结构+交换堆顶元素与末尾元素
    for (int j = n - 1; j > 0; j--) {
        swap(0, j);
        adjustHeapMin(0, j);
    }
}

int main() {
    int i;
    heapsortMin();
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    return 0;
}

运行结果如下:

相关推荐
一只码代码的章鱼41 分钟前
粒子群算法 笔记 数学建模
笔记·算法·数学建模·逻辑回归
小小小小关同学41 分钟前
【JVM】垃圾收集器详解
java·jvm·算法
圆圆滚滚小企鹅。1 小时前
刷题笔记 贪心算法-1 贪心算法理论基础
笔记·算法·leetcode·贪心算法
Kacey Huang1 小时前
YOLOv1、YOLOv2、YOLOv3目标检测算法原理与实战第十三天|YOLOv3实战、安装Typora
人工智能·算法·yolo·目标检测·计算机视觉
eguid_11 小时前
JavaScript图像处理,常用图像边缘检测算法简单介绍说明
javascript·图像处理·算法·计算机视觉
带多刺的玫瑰2 小时前
Leecode刷题C语言之收集所有金币可获得的最大积分
算法·深度优先
LabVIEW开发2 小时前
PID控制的优势与LabVIEW应用
算法·labview
涅槃寂雨2 小时前
C语言小任务——寻找水仙花数
c语言·数据结构·算法
『往事』&白驹过隙;2 小时前
操作系统(Linux Kernel 0.11&Linux Kernel 0.12)解读整理——内核初始化(main & init)之缓冲区的管理
linux·c语言·数据结构·物联网·操作系统
就爱学编程2 小时前
从C语言看数据结构和算法:复杂度决定性能
c语言·数据结构·算法