python实现堆排序的实例讲解


Posted in Python onFebruary 21, 2020

堆排序

堆是一种完全二叉树(是除了最后一层,其它每一层都被完全填充,保持所有节点都向左对齐),首先需要知道概念:最大堆问题,最大堆就是根节点比子节点值都大,并且所有根节点都满足,那么称它为最大堆。反之最小堆。

当已有最大堆,如下图,首先将7提出,然后将堆中最后一个元素放到顶点上,此时这个堆不满足最大堆了,那么我们要给它构建成最大堆,需要找到此时堆中对打元素然后交换,此时最大值为6,符合最大堆后,我们将6提取出来,然后将堆中最后一个元素放到堆的顶部...以此类推。最后提取的数值7,6,5,4,3,2,1

python实现堆排序的实例讲解

那么在维护一个最大堆过程中,最多进行交换次数决定了此算法复杂度,但交换次数与树的高度有关:

​ h=log2(n+1)h=log2(n+1)

最大堆生成:根据最大堆特性(任意一个根节点都大于叶子节点)不满足就调换。

代码实现:

from collections import deque


def swap_param(L, i, j):
 # 堆顶与最后元素交换
 L[i], L[j] = L[j], L[i]
 return L

def heap_adjust(L, start, end):
 #构造成大根堆
 temp = L[start]
 i = start
 j = 2 * i
 while j <= end:
 # 判断左右子节点,取两个子节点最大索引
 if (j < end) and (L[j] < L[j + 1]):
  j += 1
 # 判断根节点与子节点比较,如果子节点大于根节点,子节点赋值给根节点
 if temp < L[j]:
  L[i] = L[j]
  i = j
  j = 2 * i
 else:
  break
 # 再把 原来根节点值赋值给子节点上
 L[i] = temp

def heap_sort(L):
 L_length = len(L) - 1

 first_sort_count = L_length // 2
 for i in range(first_sort_count):
 heap_adjust(L, first_sort_count - i, L_length)

 for i in range(L_length - 1):
 L = swap_param(L, 1, L_length - i)
 heap_adjust(L, 1, L_length - i - 1)

 return [L[i] for i in range(1, len(L))]

def main():
 L = deque([50, 16, 30, 10, 60, 90, 2, 80, 70])
 L.appendleft(0)
 print(heap_sort(L))

main()

基础知识点扩展

堆排序

堆栈是计算机的两种最基本的数据结构。堆的特点就是FIFO(first in first out)先进先出,这里的话我觉得可以理解成树的结构。堆在接收数据的时候先接收的数据会被先弹出。

堆排序节点访问和操作定义

堆节点的访问

在这里我们借用wiki的定义来说明:

通常堆是通过一维数组来实现的。在阵列起始位置为0的情况中

  • 父节点i的左子节点在位置(2*i+1);
  • 父节点i的右子节点在位置(2*i+2);
  • 子节点i的父节点在位置floor((i-1)/2);

到此这篇关于python实现堆排序的实例讲解的文章就介绍到这了,更多相关堆排序python实现内容请搜素三水点靠木以前的文章或下面相关文章,希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python多线程实例教程
Sep 06 Python
Python解决鸡兔同笼问题的方法
Dec 20 Python
通过python+selenium3实现浏览器刷简书文章阅读量
Dec 26 Python
python的格式化输出(format,%)实例详解
Jun 01 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
python的schedule定时任务模块二次封装方法
Feb 19 Python
Pytorch之Variable的用法
Dec 31 Python
python 爬取疫情数据的源码
Feb 09 Python
对pytorch的函数中的group参数的作用介绍
Feb 18 Python
Numpy一维线性插值函数的用法
Apr 22 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
python中os.path.join()函数实例用法
May 26 Python
Python中的sys.stdout.write实现打印刷新功能
Feb 21 #Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
Feb 21 #Python
python编程进阶之异常处理用法实例分析
Feb 21 #Python
python编程进阶之类和对象用法实例分析
Feb 21 #Python
Python面向对象中类(class)的简单理解与用法分析
Feb 21 #Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 #Python
python读写文件write和flush的实现方式
Feb 21 #Python
You might like
php adodb操作mysql数据库
2009/03/19 PHP
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
destoon实现会员商铺中指定会员或会员组投放广告的方法
2014/08/21 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
php日志函数error_log用法实例分析
2019/09/23 PHP
tbody元素支持嵌套的注意方法
2007/03/24 Javascript
js 操作符实例代码
2009/10/24 Javascript
Jquery带搜索框的下拉菜单
2013/05/06 Javascript
Ubuntu中搭建Nodejs开发环境过程分享
2014/06/01 NodeJs
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
原生JavaScript编写canvas版的连连看游戏
2016/05/29 Javascript
AngularJS基础 ng-paste 指令简单示例
2016/08/02 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
深入浅出分析Python装饰器用法
2017/07/28 Python
对pandas读取中文unicode的csv和添加行标题的方法详解
2018/12/12 Python
对python内置map和six.moves.map的区别详解
2018/12/19 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
pycharm 关掉syntax检查操作
2020/06/09 Python
Python如何输出百分比
2020/07/31 Python
CSS3+DIV实现漂亮的动画彩色标签
2016/06/16 HTML / CSS
html5 学习简单的拾色器
2010/09/03 HTML / CSS
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
中层干部岗位职责
2013/12/18 职场文书
应届生简历中的自我评价
2014/01/13 职场文书
个人培训自我鉴定
2014/03/28 职场文书
化工实习心得体会
2014/09/09 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
诚信承诺书
2015/01/19 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
CSS3 制作的彩虹按钮样式
2021/04/11 HTML / CSS
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android