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

ops/2024/9/25 0:42:33/
  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.ppmy.cn/ops/115535.html

相关文章

Allegro视频去除走线的小方块

走线出现小方块图如下&#xff1a; 其实这种情况并不影响PCB生产和布线的联通性&#xff0c;只是多少会影响美观和性能&#xff0c;在Allegro视频中去除的方法比较简单&#xff0c;是由模块复用以后&#xff0c;没有打散模块引起的。只要我们将模块的打散即可。具体操作如下:…

[Linux]自定义shell详解

自定义shell 前言1.命令行提示符&#xff0c;字符串的打印1.1命令行提示符2.命令行字符串 2.0对命令行字符串进行切割2.执行命令3.有趣的小问题完整代码 前言 写之前我们先看看一个完整的shell都包括了什么 $符号前面&#xff08;包括这个符号&#xff09;就是命令行提示符&a…

C#设计模式之访问者模式

总目录 前言 在软件构建过程中&#xff0c;由于需求的改变&#xff0c;某些类层次结构中常常需要增加新的行为&#xff0c;如果直接在基类中做这样的更改&#xff0c;将会给子类带来很繁重的变更负担&#xff0c;甚至破坏原有设计。如何在不更改类层次结构的前提下&#xff0c…

数据库1-1、1-n 、n-n关系实际场景

数据库1-1、1-n 、n-n关系实际场景 每种关系类型的 3 个不同场景案例&#xff1a; 1 对 1 关系&#xff08;One-to-One&#xff09; 用户与个人资料&#xff1a; 场景&#xff1a;每个用户有唯一的个人资料&#xff0c;每个个人资料只对应一个用户。例子&#xff1a;User 和…

深入剖析Docker容器安全:挑战与应对策略

随着容器技术的广泛应用&#xff0c;Docker已成为现代应用开发和部署的核心工具。它通过轻量级虚拟化技术实现应用的隔离与封装&#xff0c;提高了资源利用率。然而&#xff0c;随着Docker的流行&#xff0c;其安全问题也成为关注焦点。容器化技术虽然提供了良好的资源隔离&…

JUC并发编程_四大函数式接口和 Stream 流式计算

JUC并发编程_四大函数式接口和 Stream 流式计算 四大函数式接口Function 接口Predicate 接口Consumer 接口Supplier 接口 Stream 流式计算Stream 的中间操作filter&#xff1a;过滤流中的元素&#xff0c;只保留满足条件的元素map&#xff1a;对流中的每个元素应用一个函数&…

【HTTP】请求“报头”(Host、Content-Length/Content-Type、User-Agent(简称 UA))

Host 表示服务器主机的地址和端口号 URL 里面不是已经有 Host 了吗&#xff0c;为什么还要写一次&#xff1f; 这里的 Host 和 URL 中的 IP 地址、端口什么的&#xff0c;绝大部分情况下是一样的&#xff0c;少数情况下可能不同当前我们经过某个代理进行转发。过程中&#xf…

Redis 主从复制

1.主从复制的概念 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master)&#xff0c;后者称为从节点(slave),数据的复制是单向的&#xff0c;只能由主节点到从节点。 默认情况下&#xff0c;每台Redis服务器都是主节…