排序算法--堆排序

server/2025/2/5 11:20:40/

堆排序是一种高效的排序算法,适合大规模数据排序,尤其适用于需要实时获取最大(或最小)值的场景。

// 交换两个元素的值
void swap(int* a, int* b) {int temp = *a;*a = *b;*b = temp;
}// 调整堆,使其满足堆的性质
void heapify(int arr[], int n, int i) {int largest = i; // 初始化最大值的索引为根节点int left = 2 * i + 1; // 左子节点int right = 2 * i + 2; // 右子节点// 如果左子节点大于根节点if (left < n && arr[left] > arr[largest]) {largest = left;}// 如果右子节点大于当前最大值if (right < n && arr[right] > arr[largest]) {largest = right;}// 如果最大值不是根节点if (largest != i) {swap(&arr[i], &arr[largest]); // 交换根节点和最大值heapify(arr, n, largest); // 递归调整受影响的子树}
}// 堆排序函数
void heapSort(int arr[], int n) {// 构建最大堆(从最后一个非叶子节点开始)for (int i = n / 2 - 1; i >= 0; i--) {heapify(arr, n, i);}// 逐个提取堆顶元素(最大值),放到数组末尾for (int i = n - 1; i > 0; i--) {swap(&arr[0], &arr[i]); // 将堆顶元素与当前末尾元素交换heapify(arr, i, 0); // 调整剩余部分为最大堆}
}
#include <stdio.h>
// 打印数组函数
void printArray(int arr[], int n) {for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");
}int main() {int arr[] = {12, 11, 13, 5, 6, 7}; // 待排序数组int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度printf("排序前的数组: \n");printArray(arr, n);heapSort(arr, n); // 调用堆排序函数printf("排序后的数组: \n");printArray(arr, n);return 0;
}

优化建议

原地排序:堆排序是原地排序算法,不需要额外空间。

稳定性:堆排序是不稳定的排序算法(相同元素的相对顺序可能改变)。

小规模数据:对于小规模数据,插入排序或选择排序可能更高效。


http://www.ppmy.cn/server/165138.html

相关文章

电脑开机键一闪一闪打不开

家人们谁懂啊&#xff01;本来打算愉快地开启游戏时光&#xff0c;或者高效处理工作任务&#xff0c;结果按下电脑开机键后&#xff0c;它就只是一闪一闪的&#xff0c;怎么都打不开。相信不少朋友都遭遇过这种令人崩溃的场景&#xff0c;满心的期待瞬间化为焦急与无奈。电脑在…

基于遗传算法的256QAM星座图的最优概率整形matlab仿真,对比优化前后整形星座图和误码率

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; GA优化曲线&#xff1a; 优化前后星座图对比 优化前后误码率对比 仿真操作步骤…

【Elasticsearch】内置分词器和IK分词器

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Acwing.基础课.排列数字(c++题解)

给定一个整数 n&#xff0c;将数字 1∼n 排成一排&#xff0c;将会有很多种排列方法。 现在&#xff0c;请你按照字典序将所有的排列方法输出。 输入格式 共一行&#xff0c;包含一个整数 n。 输出格式 按字典序输出所有排列方案&#xff0c;每个方案占一行。 数据范围 …

浏览器查询所有的存储信息,以及清除的语法

要在浏览器的控制台中查看所有的存储&#xff08;例如 localStorage、sessionStorage 和 cookies&#xff09;&#xff0c;你可以使用浏览器开发者工具的 "Application" 标签页。以下是操作步骤&#xff1a; 1. 打开开发者工具 在 Chrome 或 Edge 浏览器中&#xf…

【Go语言圣经】第七节:接口

第七章&#xff1a;接口 Golang 当中接口类型的独特之处在于它是满足隐式实现的。即&#xff1a;没必要对于给定的具体类型定义所有满足的接口类型&#xff0c;简单地拥有一些必要的方法即可。这种设计使得我们可以创建一个新的接口类型来满足已经存在的具体类型&#xff0c;却…

EtherCAT主站IGH-- 28 -- IGH之ioctl.h/c文件解析

EtherCAT主站IGH-- 28 -- IGH之ioctl.h/c文件解析 0 预览一 该文件功能`cdev.c` 文件功能函数预览二 函数功能介绍`cdev.c` 中主要函数的作用1. `ec_cdev_init`2. `ec_cdev_clear`3. `eccdev_open`4. `eccdev_release`5. `eccdev_ioctl`6. `eccdev_mmap`7. `eccdev_vma_fault`8…

CSS布局(一)flex一篇搞定

目录 一、flex布局 1.1. 认识flex布局 1.2. flex布局重要的概念 二、flex container中的属性 2.1.flex-direction 2.2.flex-wrap、flex-flow 2.3.justify-content 2.4.align-items 2.5.align-content 三、 flex item中的属性 3.1.order 3.2.align-self 3.3.flex-gr…