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计算最大优先级队列实例
Dec 18 Python
python魔法方法-自定义序列详解
Jul 21 Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 Python
python中subprocess批量执行linux命令
Apr 27 Python
python爬虫实例详解
Jun 19 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
Dec 29 Python
python中用logging实现日志滚动和过期日志删除功能
Aug 20 Python
python网络爬虫 CrawlSpider使用详解
Sep 27 Python
解决Tensorflow 内存泄露问题
Feb 05 Python
python语言的优势是什么
Jun 17 Python
python 读取yaml文件的两种方法(在unittest中使用)
Dec 01 Python
浅析Python OpenCV三种滤镜效果
Apr 11 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
PHP5函数小全(分享)
2013/06/06 PHP
ThinkPHP之用户注册登录留言完整实例
2014/07/22 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
2014/08/19 PHP
PHP用FTP类上传文件视频等的简单实现方法
2016/09/23 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
jQuery Tools tab使用介绍
2012/07/14 Javascript
jquery等宽输出文字插件使用介绍
2013/09/18 Javascript
js改变文章字体大小的实例代码
2013/11/27 Javascript
js判断出两个字符串最大子串的函数实现方法
2016/11/01 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
详解VUE 数组更新
2017/12/16 Javascript
vue单页面应用打开新窗口显示跳转页面的实例
2018/09/21 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
vue生命周期的探索
2019/04/03 Javascript
微信小程序导航栏跟随滑动效果的实现代码
2019/05/14 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
[10:21]2018DOTA2国际邀请赛寻真——Winstrike
2018/08/11 DOTA
Python编程中的异常处理教程
2015/08/21 Python
Python2.7读取PDF文件的方法示例
2017/07/13 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
详解Python做一个名片管理系统
2019/03/14 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Python中的Cookie模块如何使用
2020/06/04 Python
python爬虫判断招聘信息是否存在的实例代码
2020/11/20 Python
pandas数据分组groupby()和统计函数agg()的使用
2021/03/04 Python
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
《最大的麦穗》教学反思
2014/04/17 职场文书
实习护士自荐信
2014/06/21 职场文书
业务内勤岗位职责
2015/04/13 职场文书
汉字听写大会观后感
2015/06/12 职场文书
2015暑期爱心支教策划书
2015/07/14 职场文书
2015国庆节放假通知范文
2015/07/30 职场文书
中学教师教学工作总结
2015/08/13 职场文书
2019个人工作计划书的格式及范文!
2019/07/04 职场文书