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

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

  1. 数组初始化

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

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

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

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

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

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

#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;
}

运行结果如下:


http://www.mrgr.cn/news/35471.html

相关文章:

  • linux虚拟机无法使用yum在线拉取
  • Python →爬虫实践
  • SpringCloud篇(微服务)
  • 大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)
  • 【MinIO】Python 运用 MinIO 实现简易文件系统
  • 二叉树(C 语言)
  • SpringBoot基础知识
  • string 的介绍及使用
  • C++语言桌面应用开发GTK3 Gtkmm3 Glade
  • 在Java中如何利用ClassLoader动态加密、解密Class文件
  • 面经宝典【1】-拼多多
  • 插入、更新与删除MySQL记录
  • Python 入门教程(7)面向对象 | 7.5、继承
  • Docker部署服务:快速入门指南
  • opencv学习笔记(一)
  • Vue3——Vite篇
  • rmdir :删除空文件夹
  • Stable Diffusion绘画 | XYZ Plot:让对比一目了然
  • 优青博导团队指导-组蛋白甲基化修饰、实验设计、实验结果分析、测序分析及SCI论文辅助,精准高效,为农医学科研保驾护航!
  • 前端——阿里图标的使用
  • USB 电缆中的信号线 DP、DM 的缩写由来
  • 8086的指令系统
  • 物联网实践教程:微信小程序结合OneNET平台MQTT实现STM32单片机远程智能控制 远程上报和接收数据——汇总
  • ESXI主机加入VCENTER现有集群提示出现常规性错误
  • Python【修炼1】
  • LOGO设计新革命:5款AI工具让你秒变设计大师(必藏)