当前位置:   article > 正文

python 堆排序(保姆级教程)

python 堆排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。

  1. def heapify(arr, n, i):
  2. largest = i # 初始化最大值为根节点
  3. l = 2 * i + 1 # 左子节点的索引
  4. r = 2 * i + 2 # 右子节点的索引
  5. # 如果左子节点存在且大于根节点
  6. if l < n and arr[i] < arr[l]:
  7. largest = l
  8. # 如果右子节点存在且大于当前最大值
  9. if r < n and arr[largest] < arr[r]:
  10. largest = r
  11. # 如果最大值不是根节点
  12. if largest != i:
  13. arr[i], arr[largest] = arr[largest], arr[i] # 交换
  14. print(arr,'@') # 对每次处理过程进行输出并标记
  15. # 递归地调整受影响的子堆
  16. heapify(arr, n, largest)
  17. def heap_sort(arr):
  18. n = len(arr) # 获取列表长度
  19. # 构建最大堆,将数据调整为最大堆结构
  20. for i in range(n//2-1, -1, -1):
  21. heapify(arr, n, i)
  22. print(arr,'*')
  23. # 一个个从堆中取出元素
  24. print('--------------------')
  25. for i in range(n - 1, 0, -1):
  26. arr[i], arr[0] = arr[0], arr[i] # 交换
  27. heapify(arr, i, 0) # 将交换数据后的arr列表调整为最大堆,确保每一步都是最大堆数据结构
  28. print(arr,'-')
  29. # 测试堆排序函数
  30. arr = [1, 2, 3, 5, 6, 7]
  31. heap_sort(arr)
  32. print("排序后的数组:")
  33. print(arr)

数据处理过程:

原始列表:

arr = [1, 3, 2, 5, 4, 7]

堆型数据结构为:

构建最大堆第一步处理:

1、第一个for循环中,i =2, heapify(arr, 6, 2),运行后

2、第一个for循环中,i =1, heapify(arr, 6, 1),运行后

3、第一个for循环中,i =0, heapify(arr, 6, 0),运行后

到此第一个for循环完成,已经完成了最大堆数据的构建

开启第二个for循环,对数据进行排序的程序

1、第二个for循环 分别是5,4,3,2,1,进行遍历,

     i = 5,此时最大值的索引为0,将索引5和索引值为0的项进行交换

    heapify(arr, 5, 0)对arr列表的对数据进行调整,确保为最大堆

   1)heapify(arr, 5, 0)

 

  2) heapify(arr, 5, 1)-自调用

   已经是最大堆数据结构

2、第二个for循环 i=4 对索引是0和4的项进行交换

  1) heapify(arr, 4, 0)-递归

  2)  heapify(arr, 4, 1)-递归

  已经完成对结构的调整,是最大堆数据结构

3、第二个for循环 i=3 对索引是0和3的项进行交换

  1) heapify(arr, 3, 0)-递归

  已经条整对大堆形式的数据结构

4、第二个for循环 i=2 对索引是0和2的项进行交换

  1) heapify(arr, 2, 0)-递归

  已经调整为最大堆形式的数据

5、4、第二个for循环 i=1 对索引是0和1的项进行交换

完成所有数据排序

输出排序完成的列表

arr[1,2,3,4,5,7]

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/707490
推荐阅读
相关标签
  

闽ICP备14008679号