• 用python实现堆排序(附内置函数)


    目录

    基本概念

    自写函数实现

    内置函数实现


     

    基本概念

    大根堆:每个节点的值都大于或者等于他的左右孩子节点的值

    小根堆:每个结点的值都小于或等于其左孩子和右孩子结点的值

    父-->子:i--->左孩子:2*i+1, 右孩子:2*i+2;
    子-->父:i--->(i-1)/2; (i为下标元素)

    堆排序是一种选择排序,其最坏,最好,平均时间复杂度均为O(nlogn),同时也是不稳定排序。

    堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,即可得到一个有序序列。

     

    大根堆:每个节点的值都大于或者等于他的左右孩子节点的值

    小根堆:每个结点的值都小于或等于其左孩子和右孩子结点的值

    父-->子:i--->左孩子:2*i+1, 右孩子:2*i+2;
    子-->父:i--->(i-1)/2; (i为下标元素)

    堆排序是一种选择排序,其最坏,最好,平均时间复杂度均为O(nlogn),同时也是不稳定排序。

    堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,即可得到一个有序序列。

     

    自写函数实现

    1. def sift(li:list,low,high):
    2. """
    3. :param li: 列表
    4. :param low: 堆的根节点位置
    5. :param high: 堆的最后一个元素的位置
    6. :return:
    7. """
    8. i=low# 开始的根节点
    9. j=2*i+1# j开始是左孩子
    10. tmp=li[low]# tmp把根节点存储进来
    11. while j<=high: # 只要j位置有数
    12. if j+1<=high and li[j+1]>li[j]:
    13. j+=1
    14. if li[j]>tmp:
    15. li[i]=li[j]
    16. i=j
    17. j=2*i+1
    18. else:
    19. li[i]=tmp
    20. break
    21. else:
    22. li[i]=tmp
    23. def heap_sort(li):
    24. n=len(li)
    25. for i in range((n-2)//2,-1,-1):
    26. # i代表建堆的时候调整的部分的根的下标
    27. sift(li,i,n-1)
    28. for i in range(n-1,-1,-1):
    29. li[0],li[1]=li[1],li[0]
    30. sift(li,0, i - 1)
    31. print(li)
    32. import random
    33. li=[i for i in range(100)]
    34. random.shuffle(li)
    35. heap_sort(li)

    代码效果f52023aaff3942ce908f80dfa72e89cf.png

     

    内置函数实现

    1. # 内置函数
    2. import heapq
    3. import random
    4. li=list(range(100))
    5. random.shuffle(li)
    6. heapq.heapify(li)# 建小根堆
    7. my_=-1
    8. heapq.heappush(li,my_)
    9. for i in range(len(li)):
    10. print(heapq.heappop(li),end=',')# 往外弹出最小的元素

    代码效果

    96a2375ed1dd4a7a802fb7a49946a4e6.png

     

     

  • 相关阅读:
    RT-Thread移植到STM32单片机过程
    世界上最伟大的女程序员
    Idea 使用 —— Save Actions 插件的安装与配置
    开源在物联网(IoT)中的应用
    EN 13970防水用柔性薄板—CE认证
    Vue3系列文章 —(1)介绍
    线程池和并行处理 、线程池的作用
    2023年终总结——从零到一,从自己,到世界
    Intel HAXM
    UDP-创建群聊
  • 原文地址:https://blog.csdn.net/qq_63701832/article/details/127695813