首先理解堆排序:

堆:

堆栈是计算机的两种最基本的数据结构。堆的特点就是FIFO(first in first out)先进先出,这里的话我觉得可以理解成树的结构。堆在接收数据的时候先接收的数据会被先弹出。栈的特性正好与堆相反,是属于FILO(first in/last out)先进后出的类型。栈处于一级缓存而堆处于二级缓存中。这个不是本文重点所以不做过多展开。

思想:

本质是使用大根堆或小根堆来对一个数组进行排序。所以首先要理解树的概念,若是不太理解树的概念可以自行百度。

完全二叉树:

堆是一种完全二叉树,就是除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐的树。就像码金字塔的砖块,必须从头到底,从左到右一个一个码,不能空缺。。

大根堆小根堆定义:

大根堆:每个结点的值都大于或等于左右子结点

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

大根堆

小根堆

关于数组下标

将一个数组构建成二叉树的结构,那么对于其中某一个元素的index假设为n,满足以下条件:

1)它的父节点若存在,父节点的index为n//2(n//2指n除以2取整数)

2)若是左子节点存在,index为2*n

3)若是右子节点存在,index为2*n+1

注意:以上条件是在index是从1开始才满足,所以在后面计算中会在数组第一个位置添加一个[0]作为占位元素。

操作步骤:

以由对数组从小到大进行排序的情况,需要构建大根堆。

1.首先将整个数组进行构建一个大根堆得到[0,R1,....,Rn](具体实现后面讲)

2.由于R1是最大的数,所以把R1与Rn改变位置,变成[0,Rn,...,Rn-1,R1],此时[0,Rn...,Rn-1]是无序的,[R1]是有序的

3.对数组[0,Rn...,Rn-1]进行重构大根堆,得到[0,R2,....,Rn-1]

4.由于R2是最大的数,所以把R2与Rn-1改变位置,变成[0,Rn-1,...Rn-2,R2,R1],此时[0,Rn-1...,Rn-2]是无序的,[R2,R1]是有序的

5.重复以上步骤,直到无序列表只有[0],最终得到的有序序列则是按照从小到大规律排列的。

为了能更好的理解上面的话,我推荐看b站这个视频演示。。https://www.bilibili.com/video/av18980178?from=search&seid=3518072115040122033

代码:

1 importmath,random2

3 #网上找的打印树的一个函数,很好用,谁用谁知道

4 def print_tree(array): #打印堆排序使用

5 '''

6 深度 前空格 元素间空格7 1 7 08 2 3 79 3 1 310 4 0 111 '''

12 #first=[0]

13 #first.extend(array)

14 #array=first

15 index = 1

16 depth = math.ceil(math.log2(len(array))) #因为补0了,不然应该是math.ceil(math.log2(len(array)+1))

17 sep = ' '

18 for i inrange(depth):19 offset = 2 **i20 print(sep * (2 ** (depth - i - 1) - 1), end='')21 line = array[index:index +offset]22 for j, x inenumerate(line):23 print("{:>{}}".format(x, len(sep)), end='')24 interval = 0 if i == 0 else 2 ** (depth - i) - 1

25 if j < len(line) - 1:26 print(sep * interval, end='')27 index +=offset28 print()29

30 defsort(arr,start,end):31 if end == start * 2:32 if arr[start * 2] >arr[start]:33 arr[start * 2], arr[start] = arr[start], arr[start * 2]34 else:35 if end < start * 2 + 1:36 return

37 else:38 left = arr[start*2]39 right = arr[start*2+1]40 if left>right and left >arr[start]:41 arr[start * 2 ], arr[start] = arr[start], arr[start * 2]42 sort(arr,start*2,end)43 if leftarr[start]:44 arr[start * 2+1], arr[start] = arr[start], arr[start * 2+1]45 sort(arr, start * 2+1, end)46

47 defheapfiy(arr):48 x = len(arr) - 1

49 n = x // 2

50 while n >0:51 #print(n)

52 sort(arr, n, x)53 n -= 1

54

55 #以下是主函数

56

57 #第一个0是占位用

58 orignal_list=[0, 74, 73, 59, 72, 64, 69, 43, 36, 70, 61, 40, 16, 47, 67, 17, 31, 19, 24, 14, 20, 48, 5, 7, 3, 78, 84, 92, 97, 98, 99]59 print(orignal_list)60 #第一次构建最大堆

61 heapfiy(orignal_list)62 #打印树

63 print_tree(orignal_list)64

65 x= len(orignal_list) - 1

66 while x!=1:67 #交换最大的数和最后一个

68 orignal_list[1],orignal_list[x]=orignal_list[x],orignal_list[1]69 x-=1

70 #由于交换了,不再是最大堆,重新构建最大堆

71 n=x//2

72 while n>0:73 sort(orignal_list,n,x)74 n-=1

75

76 #打印最后结果

77 print_tree(orignal_list)78 print(orignal_list)

结果如下

堆排序python代码实现_python实现堆排序相关推荐

  1. python代码风格_Python编码风格,看这篇就够了

    如果有人问起 Python 程序员他们最喜欢 Python 哪一点,他们一定会提到 Python 的高可读性.确实,对于 Python 来说,其高可读性一直是 Python 这门语言设计的核心.一个不 ...

  2. python代码测试_Python入门学习系列——Python代码测试

    Python代码测试 对于编写的代码,可以使用unittest模块中的相关方法进行测试. 测试函数 首先定义一个简单的函数,该函数用来合并名称并返回. name_function.py: def ge ...

  3. python代码片段_Python 常用代码片段

    1.[代码][Python]代码 1.生成随机数 import random #这个是注释,引入模块 rnd = random.randint(1,500)#生成1-500之间的随机数 2.读文件 f ...

  4. google python代码规范_Python代码这样写才规范优雅! (二)

    前文传送门:Python代码这样写才规范优雅! (一)参考:https://www.python.org/dev/peps/pep-0008/Python PEP8编码规范的内容如下: 1. Intr ...

  5. c#代码转python代码工具_Python至C#代码转换

    我正在尝试将下面的python代码行转换为C#: encoded_c = chr(abs(ord(string[i]) - ord(key_c) % 256)) 这是我在C#中得到的: char en ...

  6. python代码架构_Python架构

    一.自动化测试框架 1.什么是自动化测试框架 简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境.自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本, ...

  7. python代码书写_Python代码的优雅写法,让代码更简洁

    我们都知道,Python 的设计哲学是「优雅」.「明确」.「简单」.这也许很多人选择 Python 的原因.但是我收到有些伙伴反馈,他写的 Python 并不优雅,甚至很臃肿,那可能是你的姿势不对哦! ...

  8. word2vec python 代码实现_python gensim使用word2vec词向量处理中文语料的方法

    word2vec介绍 word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间的距离. 它将term转换成向量形式,可以把对文本内容的处理简化为向量空间中的向量运算,计算出 ...

  9. 有趣的python代码实例_Python之路:200个Python有趣的小例子一网打尽

    概述 博主最近在学习python,看完了一整套学习视频,然后呃呃呃,还是用不太流畅.碰巧在全球最大的 同性交友论坛GayHub(呸!是开源代码托管平台Github)上面发现了一个项目,该项目列举了20 ...

最新文章

  1. 在数据库创建表的时候,时间设置为什么类型,会随着每次提交的时间发生变化
  2. IO模型的解释。以前解释有些失误,现在再学习一下
  3. 路径名导致的异常:javax.imageio.IIOException: Can‘t read input file!
  4. OpenAI逆炼以文生图:参数缩水2/3性能却更强,还get局部编辑新技能|可试玩
  5. 微信团队放大招!他们为了小程序居然...
  6. C#连接ORACLE数据库乱码问题
  7. linux云服务终端提示符显示-bash-4.2#解决方法
  8. CSDN挑战编程——《金色十月线上编程比赛第一题:小女孩数数》
  9. 第四十三期:2020年企业面临的20大数据安全风险
  10. [KMP]一本通(http://ybt.ssoier.cn:8088) 1698:字符串匹配
  11. 2021-2025年中国乙酰丙酸乙酯行业市场供需与战略研究报告
  12. threadx系统_实时操作系统(RTOS)市场简报
  13. 从实例入手,讲解 CMake 的常见用法。demo1-demo8
  14. 项目添加程序集的引用后老是报错
  15. python string 编解码(encode b64encode)
  16. 【手撕算法】PatchMatch图像修复算法C++实现
  17. L298N、电机、单片机的线路连接(51、stm32程序)
  18. 2018.6清北学堂day3下午笔记
  19. 麻省理工学院公开课,信号与系统: (一) 引言
  20. unity新手小球走迷宫小游戏

热门文章

  1. 关于V$OPEN_CURSOR
  2. (转)三层相关案例(及常见的错误)
  3. 转:html id与name区别
  4. 一个封装了的ADO类,功能非常强大,并做了一个DEMO演示如何操作ACCESS数据库
  5. 三个子系统_「正点原子Linux连载」第五十八章Linux INPUT子系统实验(一)
  6. 解决Mysql5.7以上版本, 使用group by抛出Expression #1 of SELECT list is not in GROUP BY clause and contains no异常
  7. linux错误日志重定向,Linux shell 重定向标准错误输出
  8. 【Git、GitHub、GitLab】四 Git文件重命名的简单方法以及使用git log查看版本演变历史
  9. C++11并发之std::thread
  10. 【旧文章搬运】无Device的驱动如何通信