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中的time模块与datetime模块用法总结
Jun 30 Python
Python3 replace()函数使用方法
Mar 19 Python
利用python如何处理百万条数据(适用java新手)
Jun 06 Python
对Python中DataFrame选择某列值为XX的行实例详解
Jan 29 Python
Python基本socket通信控制操作示例
Jan 30 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
python设置环境变量的作用和实例
Jul 09 Python
Python 项目转化为so文件实例
Dec 23 Python
Python3 pywin32模块安装的详细步骤
May 26 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 Python
Python django中如何使用restful框架
Jun 23 Python
Python 发送SMTP邮件的简单教程
Jun 24 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
世界咖啡生产者论坛呼吁:需要立即就咖啡价格采取认真行动
2021/03/06 咖啡文化
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
JavaScript 创建运动框架的实现代码
2013/05/08 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
JavaScript入门基础
2015/08/12 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
AngularJS教程之简单应用程序示例
2016/08/16 Javascript
有关suggest快速删除后仍然出现下拉列表的bug问题
2016/12/02 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
Bootstrap table 定制提示语的加载过程
2017/02/20 Javascript
jquery中关于bind()方法的使用技巧分享
2017/03/30 jQuery
Webpack中雪碧图插件使用详解
2018/05/25 Javascript
js中apply和call的理解与使用方法
2019/11/27 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
Python判断字符串与大小写转换
2015/06/08 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
pycharm远程调试openstack的图文教程
2017/11/21 Python
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
Python将list中的string批量转化成int/float的方法
2018/06/26 Python
python模拟实现分发扑克牌
2020/04/22 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
写出二分查找算法的两种实现
2013/05/13 面试题
关于Assembly命名空间的三个面试题
2015/07/23 面试题
入党自荐书范文
2014/03/09 职场文书
大学生全国两会报告感想
2014/03/17 职场文书
某某同志考察材料
2014/05/28 职场文书
团日活动总结报告
2014/06/25 职场文书
运动会广播稿50字-100字
2014/10/11 职场文书
简单租房协议书
2014/10/21 职场文书
2014全年工作总结
2014/11/27 职场文书
乡镇一岗双责责任书
2015/01/29 职场文书
施工安全保证书
2015/05/09 职场文书
遗愿清单观后感
2015/06/09 职场文书
小米11和iphone12哪个值得买?小米11对比iphone12评测
2021/04/21 数码科技