Python入门篇-数据结构堆排序Heap Sort

                                      作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.堆Heap

  堆是一个完全二叉树每个非叶子结点都要大于或者等于其左右孩子结点的值称为大顶堆每个非叶子结点都要小于或者等于其左右孩子结点的值称为小顶堆根结点一定是大顶堆中的最大值,一定是小顶堆中的最小值

二.大顶堆

  完全二叉树的每个非叶子结点都要大于或者等于其左右孩子结点的值称为大顶堆根结点一定是大顶堆中的最大值

三.小顶堆

  完全二叉树的每个非叶子结点都要小于或者等于其左右孩子结点的值称为小顶堆根结点一定是小顶堆中的最小值

四.构建完全二叉树

  待排序数字为30,20,80,40,50,10,60,70,90.构建一个完全二叉树存放数据,并根据性质5对元素编号,放入顺序的数据结构中.构造一个列表为[0,30,20,80,40,50,10,60,70,90].

五.构建大顶堆 

1>.核心算法

  度数为2的结点A,如果它的左右孩子结点的最大值比它大的,将这个最大值和该结点交换.度数为1的结点A,如果它的左孩子的值大于它,则交换.如果结点A被交换到新的位置,还需要和其孩子结点重复上面的过程.

2>.起点结点的选择

  从完全二叉树的最后一个结点的双亲结点开始,即最后一层的最右边叶子结点的父结点开始.结点数为n,则起始结点的编号为n//2(性质5).

3>.下一个结点的选择

  从起始结点开始向左找其同层结点,到头后再从上一层的最右边结点开始继续向左逐个查找,直至根结点.

4>.大顶堆的目标

  确保每个结点的都比左右结点的值大.

5>.排序

  将大顶堆根结点这个最大值和最后一个叶子结点交换,那么最后一个叶子结点就是最大值,将这个叶子结点排除在待排序结点之外.从根结点开始(新的根结点),重新调整为大顶堆后,重复上一步.堆顶和最后一个结点交换,并排除最后一个结点.

 6>.代码实现

 1 #!/usr/bin/env python
 2 #_*_coding:utf-8_*_
 3 #@author :yinzhengjie
 4 #blog:http://www.cnblogs.com/yinzhengjie/tag/python%E8%87%AA%E5%8A%A8%E5%8C%96%E8%BF%90%E7%BB%B4%E4%B9%8B%E8%B7%AF/
 5 #EMAIL:y1053419035@qq.com
 6
 7
 8 import math
 9
10
11 def print_tree(array):
12     index = 1
13     depth = math.ceil(math.log2(len(array)))        #因为补0了,不然应该是math.ceil(math.log2(len(array) + 1)
14     sep = " "
15     for i in range(depth):
16         offset = 2 ** i
17         print(sep * (2 **(depth - i -1)-1),end="")
18         line = array[index:index + offset]
19         for j,x in enumerate(line):
20             print("{:>{}}".format(x,len(sep)),end="")
21             interval = 0 if i == 0 else 2 ** (depth - i) -1
22             if j < len(line) - 1:
23                 print(sep * interval,end="")
24             index += offset
25             print()
26
27 #为了和编码对应,增加一个无用的0在首位
28 origin = [0,30,20,80,40,50,10,60,70,90]
29 total = len(origin) - 1     #初始化排序元素个数,即n
30 print(origin)
31
32 print_tree(origin)
33 print_tree("=" * 50)
34
35
36
37 def heap_adjust(n,i,array:list):
38     """
39         调整当前结点(核心算法)
40         调整的节点的起点在n//2,保证所有的调整的结点都有孩子结点
41     :param n: 待比较数个数
42     :param i: 当前结点的下标
43     :param array:待排序的数据
44     :return:
45     """
46     while 2 * i <= n:
47         #孩子结点判断2i位左孩子,2i+1为右孩子
48         lchile_index = 2 * i
49         max_child_index = lchile_index              #n = 2i
50         if n > lchile_index and array[lchile_index +1] > array[lchile_index]:       #n > 2i说明还有右孩子
51             max_child_index = lchile_index + 1      #n = 2i +1
52
53         #和子树的根结点比较
54         if array[max_child_index] > array[i]:
55             array[i],array[max_child_index] = array[max_child_index],array[i]
56             i = max_child_index                     #被比较后,需要判断是否需要调整
57         else:
58             break
59
60 #构建大顶推,大根堆
61 def max_heap(total,array:list):
62     for i in range(total//2,0,-1):
63         heap_adjust(total,i,array)
64     return array
65
66 print_tree(max_heap(total,origin))
67 print_tree("=" * 50)
68
69 #排序
70 def sort(total,array:list):
71     while total > 1:
72         array[1],array[total] = array[total],array[1]           #堆顶和最后一个结点交换
73         total -= 1
74         if total == 2 and array[total] >= array[total -1]:
75             break
76         heap_adjust(total,1,array)
77     return array
78
79 print_tree(sort(total,origin))
80 print_tree(origin)
81   

六.总结

是利用堆性质的一种选择排序,在堆顶选出最大值或者最小值时间复杂度.堆排序的时间复杂度为O(nlogn).由于堆排序对原始记录的排序状态并不敏感,因此它无论是最好、最坏和平均时间复杂度均为O(nlogn).

1>.空间复杂度

  只是使用了一个交换用的空间,空间复杂度就是O(1).

2>.稳定性

  不稳定的排序算法.

转载于:https://www.cnblogs.com/yinzhengjie/p/10970889.html

Python入门篇-数据结构堆排序Heap Sort相关推荐

  1. python tree结构_Python入门篇-数据结构树(tree)篇

    Python入门篇-数据结构树(tree)篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.树概述 1>.树的概念 非线性结构,每个元素可以有多个前躯和后继 树是n(n& ...

  2. Python入门篇-高级数据类型集合(set)和字典(dict)

    Python入门篇-高级数据类型集合(set)和字典(dict) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.集合(set) 1>.集合的特点 约定set 翻译为集合c ...

  3. 经典排序算法 - 堆排序Heap sort

    经典排序算法 - 堆排序Heap sort 堆排序有点小复杂,分成三块 第一块,什么是堆,什么是最大堆 第二块,怎么将堆调整为最大堆,这部分是重点 第三块,堆排序介绍 第一块,什么是堆,什么是最大堆 ...

  4. Python入门篇-匿名函数

    Python入门篇-匿名函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.匿名函数概述 1>.什么是匿名函数 匿名,即没有名字 匿名函数,即没有名字的函数 2>. ...

  5. Python入门篇-functools

    Python入门篇-functools 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.partial方法 1>.partial概述 偏函数,把函数部分的参数固定下来,相当 ...

  6. C语言堆排序Heap Sort算法(附完整源码)

    堆排序Heap Sort算法 堆排序Heap Sort算法的完整源码(定义,实现,main函数测试) 堆排序Heap Sort算法的完整源码(定义,实现,main函数测试) #include < ...

  7. Python入门篇-生成器函数

    Python入门篇-生成器函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.生成器概述 1>.生成器generator 生成器指的是生成器对象,可以由生成器表达式得到, ...

  8. 编程小白学python知乎周刊_在知乎上学 Python - 入门篇

    写在前面 本文对知乎上关于Python入门方面的问答.文章.专栏做了一定的收集和整理,希望对各位Python学习者能有帮助,至少可以节省大家一点时间. 这一篇主要针对的是零基础或初学Python,包括 ...

  9. 学习python(入门篇)

    俺这里想给大家初步介绍一下Python编程. 各位能看英文的, 最好是去看www.python.org上的其原作者Guido van Rossum 的入门介绍. (Python看成自1.6版以后就能处 ...

最新文章

  1. java格林认证_Java考试格林模拟题
  2. 科技部部长:基础研究是科技创新“总开关”
  3. css 命名规范 BEM
  4. 网站安全登录 web应用安全登录 密码 防截获
  5. ISA SERVER使用指南
  6. 【LeetCode】0938. 二叉搜索树的范围和(二叉树的遍历)
  7. 分支限界法:单源最短路径--dijkstra算法
  8. Git - 版本控制工具十分钟入门手册
  9. 泰晤士计算机排名2021,THE2021年世界大学专业排名-计算机
  10. TensorFlow学习笔记——TensorFlow入门
  11. 昨天,美团程序员的年终奖金可能没了!
  12. Struts2 继承ActionSupport类
  13. PPAPI中使用OpenGL ES绘图
  14. 2022G3锅炉水处理上岗证题库及答案
  15. mysql hash索引 btree索引_HASH索引做等值查询会很快,BTree索引做范围查询比较快...
  16. 腾讯云轻量应用服务器搭建网站
  17. Java常用类之String类知识清单,简单易理解
  18. 网络流量分析详解(包含OSI七层模型、TCP协议及Wireshark工具用法)
  19. colorkey口红怎么样_COLORKEY口红最近太火!不到50块,颜色比大牌还美,尤其是这4支...
  20. 网站后台没有提示声怎么办_收藏 | 没有 PS 怎么办?10个在线作图网站,轻松搞定图片设计...

热门文章

  1. OpenGL选择机制的一点讨论
  2. android某个活动全屏,android – 重新组合活动布局,以便在旋转屏幕时全屏播放视频...
  3. 适合平面设计的linux版本,Qogir - 色彩鲜艳的Linux平面设计图标主题
  4. java 反射深度克隆_C#使用反射(Reflection)实现深复制与浅复制
  5. java script中==和===_Java Script与CSS的问题
  6. 两位一体数码管引脚图_两位一体共阴数码管,第二位数字显示不出来,按钮第7按钮按下去来回显示,但第一位又不显示了,,,急...
  7. python比赛2020_2020蓝桥杯python组备战方法
  8. springaop事务逻辑原理_太狠了!阿里大牛手写的Spring核心面试笔记:IOC+AOP+MVC+事务...
  9. 他花了一个月,使用MicroPython将自己装进OLED里面
  10. 利用WiFi模块实现MicroPython远程开发