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判断windows隐藏文件的方法
Mar 21 Python
Python 中 list 的各项操作技巧
Apr 13 Python
python的concat等多种用法详解
Nov 28 Python
Python3.5 处理文本txt,删除不需要的行方法
Dec 10 Python
python利用selenium进行浏览器爬虫
Apr 25 Python
Django框架静态文件使用/中间件/禁用ip功能实例详解
Jul 22 Python
深入解析神经网络从原理到实现
Jul 26 Python
python自动生成model文件过程详解
Nov 02 Python
tensorflow 实现数据类型转换
Feb 17 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
Python 多线程之threading 模块的使用
Apr 14 Python
Python使用PyYAML库读写yaml文件的方法
Apr 06 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
解决控件遮挡问题:关于有窗口元素和无窗口元素
2007/01/28 PHP
php session_start()出错原因分析及解决方法
2013/10/28 PHP
php将url地址转化为完整的a标签链接代码(php为url地址添加a标签)
2014/01/17 PHP
2014年10个最佳的PHP图像操作库
2014/07/14 PHP
两种设置php载入页面时编码的方法
2014/07/29 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
Laravel中Facade的加载过程与原理详解
2017/09/22 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
php和nginx交互实例讲解
2019/09/24 PHP
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
在Firefox下js select标签点击无法弹出
2014/03/06 Javascript
Javascript核心读书有感之类型、值和变量
2015/02/11 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
JavaScript数据类型之基本类型和引用类型的值
2015/04/01 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
Node.js实现发送邮件功能
2017/11/06 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
JS中appendChild追加子节点无效的解决方法
2018/10/14 Javascript
uni-app 支持多端第三方地图定位的方法
2020/01/03 Javascript
用VsCode编辑TypeScript的实现方法
2020/05/07 Javascript
H5 js点击按钮复制文本到粘贴板
2020/11/19 Javascript
Python使用装饰器模拟用户登陆验证功能示例
2018/08/24 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
Smallable英国家庭概念店:设计师童装及家居装饰
2017/07/05 全球购物
网上书店创业计划书
2014/01/12 职场文书
考试退步检讨书
2014/01/15 职场文书
企业员工培训感言
2014/02/26 职场文书
技校毕业生自荐信
2014/06/03 职场文书
财务科长个人对照检查材料
2014/09/18 职场文书
幼儿园教学工作总结2015
2015/05/12 职场文书
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python