码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • C语言堆排序


     

    堆排序(Heapsort)是一种在时间复杂度上达到了最优的基于比较的排序算法。堆排序算法是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。

    堆排序的基本思想是:

    1. 首先将待排序的序列构造成一个大顶堆(或小顶堆)。
    2. 此时,整个序列的最大值(或最小值)就是堆顶的根节点。
    3. 将其与末尾元素进行交换,此时末尾就为最大值(或最小值)。
    4. 然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值(或次大值)。
    5. 如此反复执行,便能得到一个有序序列了。

    堆排序的时间复杂度是O(n log n)。

    1. #include
    2. // 将以k为根的子树调整为最大堆
    3. void heapify(int arr[], int n, int k) {
    4. int largest = k; // 初始化根节点最大
    5. int left = 2 * k + 1; // 左子节点
    6. int right = 2 * k + 2; // 右子节点
    7. // 如果左子节点比根节点大,则更新最大节点
    8. if (left < n && arr[left] > arr[largest]) {
    9. largest = left;
    10. }
    11. // 如果右子节点比最大节点大,则更新最大节点
    12. if (right < n && arr[right] > arr[largest]) {
    13. largest = right;
    14. }
    15. // 如果最大节点不是根节点,则交换根节点和最大节点,并继续调整子树
    16. if (largest != k) {
    17. int temp = arr[k];
    18. arr[k] = arr[largest];
    19. arr[largest] = temp;
    20. heapify(arr, n, largest);
    21. }
    22. }
    23. // 堆排序函数
    24. void heapSort(int arr[], int n) {
    25. // 构建最大堆
    26. for (int i = n / 2 - 1; i >= 0; i--) {
    27. heapify(arr, n, i);
    28. }
    29. // 从堆顶开始取出元素,并重新调整堆
    30. for (int i = n - 1; i >= 0; i--) {
    31. int temp = arr[0];
    32. arr[0] = arr[i];
    33. arr[i] = temp;
    34. heapify(arr, i, 0);
    35. }
    36. }
    37. int main() {
    38. int arr[] = {10, 7, 8, 9, 1, 5};
    39. int n = sizeof(arr) / sizeof(arr[0]);
    40. printf("Original array: ");
    41. for (int i = 0; i < n; i++) {
    42. printf("%d ", arr[i]);
    43. }
    44. printf("\n");
    45. heapSort(arr, n);
    46. printf("Sorted array: ");
    47. for (int i = 0; i < n; i++) {
    48. printf("%d ", arr[i]);
    49. }
    50. printf("\n");
    51. return 0;
    52. }

    该代码中,heapify函数将以k为根的子树调整为最大堆,heapSort函数则先构建最大堆,然后从堆顶开始取出元素并重新调整堆,最终得到排序后的数组。

  • 相关阅读:
    CocosCreator3.8研究笔记(四)CocosCreator 脚本说明及使用(上)
    如何使用 SEGGER Embedded Studio创建库文件?
    记录两次多端排查问题的过程
    RecyclerView源码解析(四):RecyclerView对ViewHolder的回收
    前后端分离计算机毕设项目之基于SpringBoot的旅游网站的设计与实现《内含源码+文档+部署教程》
    (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
    Figma切图,轻松上手!
    Android系统定制之监听USB键盘来判断是否弹出软键盘
    Java的练习题
    项目示例 - 4.配置中心 - 1.Nacos
  • 原文地址:https://blog.csdn.net/MyLovelyJay/article/details/133001675
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号