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


    堆

    堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。因此分为大根堆与小跟堆。

    大根堆:升序

    非叶子节点值大于等于左右子节点值:i \geq 2i && i \geq 2i+1

    小根堆:降序

    非叶子节点值小于等于左右子节点值:i \leq 2i && i \leq 2i +1

     堆排序:

    思路:

            1、构造n个数值的大根堆或小根堆

            2、将堆顶(最大或最小值),放至堆尾

            3、继续构造前n-1个数值,n = n-1 转1,如此循环

            4、输出 升序或降序 序列

    算法(大根堆)    i:根结点 2i:左节点 2i+1:右节点

    1、从非叶子节点开始调整 n/2

    2、在第2i个节点和第2i+1个节点中(左右节点)选最大值为X

    3、若第i个节点(根)小于X则二者交换

    4、交换后还需考虑以2i为根或2i+1为根的子树是否仍是堆,如不是则需要继续向下调整。

    5、 1~4 循环至堆顶为最大值

    6、堆顶堆尾交换元素,最大值放置最后。前 n - 1 继续调整,转 1; n == 0 结束

    注:图像不清晰,资源有上传视频:堆排序-CSDN直播

    代码

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. //<:升序,大根堆, >:降序,小根堆
    6. #define cmp <
    7. typedef int Node;
    8. void printHeap(vector<int>& heap){
    9. for(auto i: heap){
    10. cout << i << " ";
    11. }
    12. cout << endl;
    13. }
    14. void nodeAdjust(vector& tree, Node root, int size){
    15. int swapNode = root;
    16. //左右节点
    17. Node leftNode = root * 2 + 1;
    18. Node rightNode = root * 2 + 2;
    19. //叶子节点无需调整
    20. if(root > size/2-1 ) return;
    21. //左右节点与根结点进行比较,找极大或极小值
    22. if(leftNode < size && tree[swapNode] cmp tree[leftNode])
    23. swapNode = leftNode;
    24. if(rightNode < size && tree[swapNode] cmp tree[rightNode])
    25. swapNode = rightNode;
    26. if( tree[root] cmp tree[swapNode] ){
    27. //交换节点
    28. swap(tree[root], tree[swapNode]);
    29. //子节点被调整,则对应的子树堆被破坏需要重新调整
    30. nodeAdjust(tree, swapNode, size);
    31. }
    32. }
    33. //对于每个非叶子节点都进行调整,从后往前
    34. void heapAdjust(vector& tree, int size){
    35. for(int i = size/2-1; i >= 0; i --){
    36. nodeAdjust(tree, i, size);
    37. }
    38. }
    39. void heapSort(vector<int>& heap, int size){
    40. for(int i = 0; i < size; i++){
    41. //调整堆
    42. heapAdjust(heap, size - i);
    43. //将极值放最后
    44. swap(heap[0], heap[size - 1 - i ]);
    45. }
    46. }
    47. int main(){
    48. vector<int> tree = {2, 4, 1, 3, 6};
    49. heapSort(tree, tree.size());
    50. printHeap(tree);
    51. }

  • 相关阅读:
    爬虫记录——第三方钱包加密参数逆向
    【C++面向对象侯捷下】4. pointer-like classes,关于智能指针 | 5. function-like classes,所谓仿函数
    Harmonyos Next——图片上传与下载
    对话PostgreSQL作者Bruce:“转行”是为了更好地前行
    设计并实现一个并发安全的LRU(Least Recently Used,最近最少使用)缓存结构
    漏波天线解析
    vs2017/2019串口Qt Serial Port/modbus使用报错
    湖北省科技企业孵化器和众创空间申报奖励补贴标准,2022年认定条件汇总
    MSDC 4.3 接口规范(29)
    润色论文Prompt
  • 原文地址:https://blog.csdn.net/qq_32116001/article/details/127401340
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号