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


    目录

    一、基本概念

    二、大小堆

    三、堆实现heapify

    1、把列表转化为堆 【大项堆】

     2、对堆做 heapify

    2.1  树的第四层子节点,和父节点,第三层层进行大项堆比较,【红色的是比较交换后的数字】​编辑        

    2.2  树的第三层子节点,和父节点,第二层进行大项堆比较,【绿色的是比较交换后的数字】 

    ​2.3 树的第二层子节点,和父节点,第一层进行大项堆比较,【换色色的是比较交换后的数字】 ​编辑

    2.4 代码来实现

     3、对堆进行排序

    3.1 最后的节点和根节点做交换【5,50做交换】,砍掉最后的节点

    3.3 、在对节点做heapify,之后,根节点在和最后的最后的节点,做交换【48,5】,砍掉最后的节点

     3.3 、以此类推,根节点在和最后的最后的节点,做交换【47,5】,砍掉最后的节点,其他的节点也是这样实现,就不一一列举了

    3.4 代码实现这部分排序

     四、完整代码

    一、基本概念

    首要需要理解的堆是由树组成,一种叫做完全二叉树的数据结构。

    二、大小堆

    大顶堆:每个节点的值都大于或者等于它的左右子节点的值。

    小顶堆:每个节点的值都小于或者等于它的左右子节点的值。
    可以得到的排序排序的列表
     

    对于大顶堆:arr[i] >= arr[2i + 1] && arr[i] >= arr[2i + 2]

    对于小顶堆:arr[i] <= arr[2i + 1] && arr[i] <= arr[2i + 2]

    三、堆实现heapify

    1、把列表转化为堆 【大项堆】

    listF = [4, 48, 3, 50, 4, 47, 5, 38, 15, 46, 19, 44, 27, 26, 36]

    parent_node = (i -1) /2   # i 代表再树中索引的位置  
    lef_node = 2 * i +1  
    ritht_node = 2 * 1 +2

     2、对堆做 heapify

            2.1  树的第四层子节点,和父节点,第三层层进行大项堆比较,【红色的是比较交换后的数字】
            2.2  树的第三层子节点,和父节点,第二层进行大项堆比较,【绿色的是比较交换后的数字】 

     2.3 树的第二层子节点,和父节点,第一层进行大项堆比较,【换色色的是比较交换后的数字】 

      2.4 代码来实现

    • 1、对第四层、第三层、第二层、第一层,进行递归调用heapify 方法大项堆的排序
    • 2、实现大项堆比较排序
    1. # 1、建立大顶堆
    2. def buildMaxHeap(arr,n):
    3. # arr 代表当前排序的列表,n 表示当前树的数据范围【及arr的个数】
    4. last_node_index = n -1 #最后的的节点的索引
    5. parent_node_index = int((last_node_index-1)/2)
    6. if parent_node_index >= 0:
    7. for i in range(parent_node_index,-1,-1):
    8. #i 是这个堆现在有多少个节点
    9. heapify(arr=arr,i=i,n=n)
    10. #2、子节点和父节点进行最大值交换
    11. def heapify(arr,i,n):
    12. #arr 代表当前排序的列表, i 当表当前的书的parent node ,n 表示当前树的数据范围【及arr的个数】
    13. left = 2 * i + 1 #找出左节点的索引
    14. right = 2 * i + 2 #书中右节点的索引
    15. largest = i #当前的parent
    16. #如果有左节点,并且左节点的值更大,更新最大值的索引 left < n越界
    17. if left < n and arr[left] > arr[largest]: # 判断是否,(left < n)越界
    18. largest =left
    19. # 如果有右节点,并且右节点的值更大,更新最大值的索引
    20. if right < n and arr[right] > arr[largest]: #判断是否,(left < n)越界
    21. largest = right
    22. #如果最大值不是当前非叶子节点的值,那么就把当前节点和最大值的子节点值互换
    23. if largest != i:
    24. arr[i] ,arr[largest] =arr[largest],arr[i] #节点值进行互换
    25. heapify(arr,largest,n)

     3、对堆进行排序

    3.1 最后的节点和根节点做交换【5,50做交换】,砍掉最后的节点

     


     

    3.3 、在对节点做heapify,之后,根节点在和最后的最后的节点,做交换【48,5】,砍掉最后的节点


     3.3 、以此类推,根节点在和最后的最后的节点,做交换【47,5】,砍掉最后的节点,其他的节点也是这样实现,就不一一列举了


    3.4 代码实现这部分排序

     

    1. def heapSort(arr):
    2. if arr == None or len(arr) ==0:
    3. return
    4. n = len(arr)
    5. #构建大顶堆,变成一个大顶堆的数组
    6. buildMaxHeap(arr,n)
    7. if n >0:
    8. for a in range(n-1,0,-1):
    9. arr[a], arr[0] = arr[0], arr[a]
    10. heapify(arr,0,a)
    11. return arr

     四、完整代码

    1. listF = [4, 48, 3, 50, 4, 47, 5, 38, 15, 46, 19, 44, 27, 26, 36]
    2. # 1、建立大顶堆
    3. def buildMaxHeap(arr,n):
    4. # arr 代表当前排序的列表,n 表示当前树的数据范围【及arr的个数】
    5. last_node_index = n -1 #最后的的节点的索引
    6. parent_node_index = int((last_node_index-1)/2)
    7. if parent_node_index >= 0:
    8. for i in range(parent_node_index,-1,-1):
    9. #i 是这个堆现在有多少个节点
    10. heapify(arr=arr,i=i,n=n)
    11. def heapify(arr,i,n):
    12. #arr 代表当前排序的列表, i 当表当前的书的parent node ,n 表示当前树的数据范围【及arr的个数】
    13. left = 2 * i + 1 #找出左节点的索引
    14. right = 2 * i + 2 #书中右节点的索引
    15. largest = i #当前的parent
    16. #如果有左节点,并且左节点的值更大,更新最大值的索引 left < n越界
    17. if left < n and arr[left] > arr[largest]: # 判断是否,(left < n)越界
    18. largest =left
    19. # 如果有右节点,并且右节点的值更大,更新最大值的索引
    20. if right < n and arr[right] > arr[largest]: #判断是否,(left < n)越界
    21. largest = right
    22. #如果最大值不是当前非叶子节点的值,那么就把当前节点和最大值的子节点值互换
    23. if largest != i:
    24. arr[i] ,arr[largest] =arr[largest],arr[i] #节点值进行互换
    25. heapify(arr,largest,n)
    26. def heapSort(arr):
    27. if arr == None or len(arr) ==0:
    28. return
    29. n = len(arr)
    30. #构建大顶堆,变成一个大顶堆的数组
    31. buildMaxHeap(arr,n)
    32. if n >0:
    33. for a in range(n-1,0,-1): #从 n -1 最后一个节点出发
    34. arr[a], arr[0] = arr[0], arr[a]
    35. heapify(arr,0,a)
    36. return arr
    37. print(heapSort(listF))

     

     

  • 相关阅读:
    SpringCloud之gateway——流量控制组件Sentinel实战
    MySQL Explain 关键字详解
    算法leetcode|85. 最大矩形(rust重拳出击)
    嵌入式STM32 单片机 GPIO 的工作原理详解
    HAproxy+Nginx7层负载均衡
    【一文带你详细学习RocketMQ存储设计方案、RocketMQ中消息文件存储结构、过期文件删除机制、零拷贝与MMAP内存映射】
    Pandas - 数据合并
    Golang依赖管理(GOPATH->vendor->Go Module)
    面试理论篇二
    使用C# 创建、填写、删除PDF表单域
  • 原文地址:https://blog.csdn.net/Smart_look/article/details/125357541
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | 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号