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程序语言快速上手教程
Jul 18 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
python实现嵌套列表平铺的两种方法
Nov 08 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
Apr 12 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
python的debug实用工具 pdb详解
Jul 12 Python
Python threading的使用方法解析
Aug 28 Python
python 线性回归分析模型检验标准--拟合优度详解
Feb 24 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 Python
PyCharm中配置PySide2的图文教程
Jun 18 Python
python不同系统中打开方法
Jun 23 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
thinkPHP框架实现生成条形码的方法示例
2018/06/06 PHP
PHP多进程通信-消息队列使用
2019/03/08 PHP
JS模块与命名空间的介绍
2013/03/22 Javascript
简单几行JS Code实现IE邮件转发新浪微博
2013/07/03 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
ExtJS4 表格的嵌套 rowExpander应用
2014/05/02 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
jQuery实现文字自动横移
2017/01/08 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
vue生成token保存在客户端localStorage中的方法
2017/10/25 Javascript
vue组件父子间通信之综合练习(聊天室)
2017/11/07 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
Javascript Promise用法详解
2018/05/10 Javascript
python中global用法实例分析
2015/04/30 Python
Python之文字转图片方法
2018/05/10 Python
浅谈pytorch和Numpy的区别以及相互转换方法
2018/07/26 Python
python3中os.path模块下常用的用法总结【推荐】
2018/09/16 Python
简单了解Python matplotlib线的属性
2019/06/29 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
python实现tail -f 功能
2020/01/17 Python
Jupyter notebook 远程配置及SSL加密教程
2020/04/14 Python
python实现批量转换图片为黑白
2020/06/16 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
初婚未育证明
2014/01/15 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
化妆品促销方案
2014/02/24 职场文书
火灾现场处置方案
2014/05/28 职场文书
大学生学习新党章思想汇报
2014/10/25 职场文书
教师求职简历自我评价
2015/03/10 职场文书
运动会通讯稿100字
2015/07/20 职场文书
2016年寒假见闻
2015/10/10 职场文书
Python实现排序方法常见的四种
2021/07/15 Python