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实现并行抓取整站40万条房价数据(可更换抓取城市)
Dec 14 Python
Django实现简单分页功能的方法详解
Dec 05 Python
深入浅析python with语句简介
Apr 11 Python
关于pycharm中pip版本10.0无法使用的解决办法
Oct 10 Python
Python实现图片识别加翻译功能
Dec 26 Python
如何在Django中使用聚合的实现示例
Mar 23 Python
python 的topk算法实例
Apr 02 Python
python轮询机制控制led实例
May 03 Python
Python使用configparser读取ini配置文件
May 25 Python
Python替换NumPy数组中大于某个值的所有元素实例
Jun 08 Python
解决python的空格和tab混淆而报错的问题
Feb 26 Python
Python+Selenium自动化环境搭建与操作基础详解
Mar 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
一个简易需要注册的留言版程序
2006/10/09 PHP
PHP下escape解码函数的实现方法
2010/08/08 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
PHP的Yii框架中行为的定义与绑定方法讲解
2016/03/18 PHP
PHP设计模式之原型模式定义与用法详解
2018/04/03 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
5 cool javascript apps
2007/03/24 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
JQueryEasyUI Layout布局框架的使用
2013/04/08 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
jquery获取radio值(单选组radio)
2014/10/16 Javascript
jquery提示效果实例分析
2014/11/25 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
js实现选项卡内容切换以及折叠和展开效果【推荐】
2017/01/08 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
vue动态组件实现选项卡切换效果
2017/03/08 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
nodejs实现的http、https 请求封装操作示例
2020/02/06 NodeJs
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
浅谈Python 对象内存占用
2016/07/15 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
python numpy存取文件的方式
2020/04/01 Python
python 输出列表元素实例(以空格/逗号为分隔符)
2019/12/25 Python
python求最大公约数和最小公倍数的简单方法
2020/02/13 Python
蔻驰英国官网:COACH英国
2020/07/19 全球购物
网络技术支持面试题
2013/04/22 面试题
助理政工师申报材料
2014/06/03 职场文书
爱护花草树木的标语
2014/06/11 职场文书
学校标语大全
2014/06/19 职场文书
党的群众路线教育实践活动个人整改方案
2014/09/21 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
先进工作者推荐材料
2014/12/23 职场文书
先进班组事迹材料
2014/12/25 职场文书
机修车间主任岗位职责
2015/04/08 职场文书