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的Django框架中用流响应生成CSV文件的教程
May 02 Python
python算法表示概念扫盲教程
Apr 13 Python
python docx 中文字体设置的操作方法
May 08 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
Django中使用Celery的教程详解
Aug 24 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
python中if及if-else如何使用
Jun 02 Python
keras实现VGG16 CIFAR10数据集方式
Jul 07 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
如何基于Python pygame实现动画跑马灯
Nov 18 Python
高考要来啦!用Python爬取历年高考数据并分析
Jun 03 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
IIS+PHP+MySQL+Zend配置 (视频教程)
2006/12/13 PHP
php 信息采集程序代码
2009/03/17 PHP
php计算给定时间之前的函数用法实例
2015/04/03 PHP
Symfony2框架学习笔记之表单用法详解
2016/03/18 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
2016/12/07 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
PHP 实现缩略图
2021/03/09 PHP
javascript 树控件 比较好用
2009/06/11 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
对JavaScript中this指针的新理解分享
2015/01/31 Javascript
再谈JavaScript异步编程
2016/01/27 Javascript
jQuery原理系列-css选择器的简单实现
2016/06/07 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
JavaScript插件Tab选项卡效果
2017/11/14 Javascript
对类Vue的MVVM前端库的实现代码
2018/09/07 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
Python生成随机MAC地址
2015/03/10 Python
Python随手笔记第一篇(2)之初识列表和元组
2016/01/23 Python
Python中functools模块函数解析
2017/03/12 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
python实现连续图文识别
2018/12/18 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
2019/08/24 Python
瑞典时尚耳机品牌:Urbanears
2017/07/26 全球购物
美国领先的家庭智能音响系统品牌:Sonos
2018/07/20 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
电气工程师岗位职责
2014/01/01 职场文书
奥巴马的演讲稿
2014/05/15 职场文书
远程培训的心得体会
2014/09/01 职场文书
医院反腐倡廉演讲稿
2014/09/16 职场文书
普通党员个人对照检查材料
2014/09/18 职场文书
如何使用Python对NetCDF数据做空间相关分析
2021/04/21 Python