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实现代理服务功能实例
Nov 15 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
Python实现连接两个无规则列表后删除重复元素并升序排序的方法
Feb 05 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
Python jieba库用法及实例解析
Nov 04 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
Python图片的横坐标汉字实例
Dec 04 Python
Matplotlib使用字符串代替变量绘制散点图的方法
Feb 17 Python
Python魔术方法专题
Jun 19 Python
使用AJAX和Django获取数据的方法实例
Oct 25 Python
如何用 Python 制作 GitHub 消息助手
Feb 20 Python
python爬取新闻门户网站的示例
Apr 25 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关联链接常用代码
2012/11/05 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
PHP MPDF中文乱码的解决方式
2015/12/08 PHP
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
google jQuery 引用文件,jQuery 引用地址集合(jquery 1.2.6至jquery1.5.2)
2011/04/24 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
2014/10/28 Javascript
JavaScript实现的内存数据库LokiJS介绍和入门实例
2014/11/17 Javascript
jQuery插件Timelinr 实现时间轴特效
2015/10/04 Javascript
jQuery文字提示与图片提示效果实现方法
2016/07/04 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
微信小程序实现选项卡效果
2018/11/06 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
Flutter实现仿微信底部菜单栏功能
2019/09/18 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
JS自定义对象创建与简单使用方法示例
2020/01/15 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
python使用reportlab实现图片转换成pdf的方法
2015/05/22 Python
pandas通过loc生成新的列方法
2018/11/28 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
Python数据抓取爬虫代理防封IP方法
2018/12/23 Python
Python中三元表达式的几种写法介绍
2019/03/04 Python
python装饰器代替set get方法实例
2019/12/19 Python
python实现电子词典
2020/03/03 Python
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
亚马逊巴西站:Amazon.com.br
2019/09/22 全球购物
木工主管岗位职责
2013/12/08 职场文书
社团活动策划书范文
2014/01/09 职场文书
置业顾问岗位职责
2014/03/02 职场文书
农村婚礼主持词
2014/03/13 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
超详细Python解释器新手安装教程
2021/05/10 Python
Python基础之进程详解
2021/05/21 Python
使用CSS实现百叶窗效果示例代码
2023/05/07 HTML / CSS