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全局变量操作详解
Apr 14 Python
python基于Tkinter库实现简单文本编辑器实例
May 05 Python
python通过加号运算符操作列表的方法
Jul 28 Python
Python中http请求方法库汇总
Jan 06 Python
Python 的描述符 descriptor详解
Feb 27 Python
使用rst2pdf实现将sphinx生成PDF
Jun 07 Python
Python脚本实现Web漏洞扫描工具
Oct 25 Python
Flask模板引擎之Jinja2语法介绍
Jun 26 Python
Python 使用多属性来进行排序
Sep 01 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
Win下PyInstaller 安装和使用教程
Dec 25 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 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 echo 输出字符串函数详解
2010/05/13 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
2014/06/12 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
Laravel实现表单提交
2017/05/07 PHP
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
JS OffsetParent属性深入解析
2014/01/13 Javascript
js判断当前浏览器类型,判断IE浏览器方法
2014/06/02 Javascript
JavaScript实现简单的数字倒计时
2015/05/15 Javascript
php利用curl获取远程图片实现方法
2015/10/26 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
基于BootStrap Metronic开发框架经验小结【四】Bootstrap图标的提取和利用
2016/05/12 Javascript
深入理解jQuery layui分页控件的使用
2016/08/17 Javascript
详解js的事件处理函数和动态创建html标记方法
2016/12/16 Javascript
JS原型与原型链的深入理解
2017/02/15 Javascript
基于vue的fullpage.js单页滚动插件
2017/03/20 Javascript
微信小程序实现倒计时60s获取验证码
2020/04/17 Javascript
代码详解JS操作剪贴板
2018/02/11 Javascript
微信小程序下拉框功能的实例代码
2018/11/06 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
antd的select下拉框因为数据量太大造成卡顿的解决方式
2020/10/31 Javascript
python用ConfigObj读写配置文件的实现代码
2013/03/04 Python
Python搭建HTTP服务器和FTP服务器
2017/03/09 Python
tensorflow建立一个简单的神经网络的方法
2018/02/10 Python
Python简易版停车管理系统
2019/08/12 Python
阿迪达斯西班牙官方网站:adidas西班牙
2016/07/21 全球购物
Java Servlet API中forward() 与redirect()的区别
2014/04/20 面试题
会计电算化专业个人的自我评价
2013/11/24 职场文书
自我鉴定注意事项
2014/01/19 职场文书
学校安全责任书
2014/04/14 职场文书
法学求职信
2014/06/22 职场文书
个人遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
继续教育心得体会(共6篇)
2016/01/19 职场文书