本文实例讲述了Python实现堆排序的方法。分享给大家供大家参考,具体如下:

堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是一种原地排序算法,除了输入数组以外只占用常数个元素空间。

堆(定义):(二叉)堆数据结构是一个数组对象,可以视为一棵完全二叉树。如果根结点的值大于(小于)其它所有结点,并且它的左右子树也满足这样的性质,那么这个堆就是大(小)根堆。

我们假设某个堆由数组A表示,A[1]为树的根,给定某个结点的下标i,其父结点、左孩子、右孩子的下标都可以计算出来:

PARENT(i):

return i/2

LEFT(i):

return 2i

RIGHT(i):

return 2i+1

堆排序Python实现

所谓堆排序的过程,就是把一些无序的对象,逐步建立起一个堆的过程。

下面是用Python实现的堆排序的代码:

def build_max_heap(to_build_list):

"""建立一个堆"""

# 自底向上建堆

for i in range(len(to_build_list)/2 - 1, -1, -1):

max_heap(to_build_list, len(to_build_list), i)

def max_heap(to_adjust_list, heap_size, index):

"""调整列表中的元素以保证以index为根的堆是一个最大堆"""

# 将当前结点与其左右子节点比较,将较大的结点与当前结点交换,然后递归地调整子树

left_child = 2 * index + 1

right_child = left_child + 1

if left_child < heap_size and to_adjust_list[left_child] > to_adjust_list[index]:

largest = left_child

else:

largest = index

if right_child < heap_size and to_adjust_list[right_child] > to_adjust_list[largest]:

largest = right_child

if largest != index:

to_adjust_list[index], to_adjust_list[largest] = \

to_adjust_list[largest], to_adjust_list[index]

max_heap(to_adjust_list, heap_size, largest)

def heap_sort(to_sort_list):

"""堆排序"""

# 先将列表调整为堆

build_max_heap(to_sort_list)

heap_size = len(to_sort_list)

# 调整后列表的第一个元素就是这个列表中最大的元素,将其与最后一个元素交换,然后将剩余的列表再调整为最大堆

for i in range(len(to_sort_list) - 1, 0, -1):

to_sort_list[i], to_sort_list[0] = to_sort_list[0], to_sort_list[i]

heap_size -= 1

max_heap(to_sort_list, heap_size, 0)

if __name__ == '__main__':

to_sort_list = [4, 1, 3, 2, 16, 9, 10, 14, 8, 7]

heap_sort(to_sort_list)

print to_sort_list

更多关于Python相关内容可查看本站专题:《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

本文标题: Python实现堆排序的方法详解

本文地址: http://www.cppcns.com/jiaoben/python/148969.html

python中堆排序_Python实现堆排序的方法详解相关推荐

  1. python中的class怎么用_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  2. python中class变量_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  3. 站长在线Python精讲:在Python中匹配字符串的3个方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中匹配字符串的3个方法详解>.本知识点主要内容有:使用match()方法进行匹配.使用search()方法进行 ...

  4. 站长在线Python精讲:在Python中格式化字符串的两种方法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<在Python中格式化字符串的两种方法详解>.本知识点主要内容有:使用%操作符格式化字符串和使用format()方法格式化字 ...

  5. python清空集合_python集合删除多种方法详解

    这篇文章主要介绍了python集合删除多种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 删除指定的元素 A={'a','c','b','d ...

  6. Python中的星号本质及其使用方法详解

    翻译:Python 开发者 - 一汀, 英文:Trey Hunner http://blog.jobbole.com/114655/ Python开发者 在 Python 中有很多地方可以看到*和** ...

  7. python没有大括号_Python如何省略括号方法详解

    在Python语言中最常见的括号有三种,分别是:小括号().中括号[].花括号{}:其作用也不相同,分别用来代表不同的Python基本内置数据类型. 1.Python中的小括号(): 代表tuple元 ...

  8. python找图是什么模块-python中模块查找的原理与方法详解

    前言 本文主要给大家介绍了关于python模块查找的原理与方式,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 基础概念 module 模块, 一个 py 文件或以其他文件形式存在的可被 ...

  9. 怎么用python写数据库_Python实现数据库编程方法详解

    本文实例讲述了Python实现数据库编程方法.分享给大家供大家参考.具体分析如下: 用PYTHON语言进行数据库编程, 至少有六种方法可供采用. 我在实际项目中采用,不但功能强大,而且方便快捷.以下是 ...

  10. python 获取当前日期和时间,Python中获取当前日期和时间的方法详解

    在Python语言里,我们可以通过调用什么模块或者类函数来得到当前的时间或日期呢?本文就将和大家一起来扒一扒这部分内容,一起来看看吧. 当然你可以使用时间模块(time module),该模块提供了各 ...

最新文章

  1. CentOS7.4到Elasticsearch一路坑(五)
  2. 2018湖北计算机准考证打印,2018年3月湖北计算机等级考试准考证打印入口
  3. ArcGIS快速裁剪栅格数据
  4. 网络克隆报a:\ghosterr.txt故障解决一例
  5. LeetCode 646. 最长数对链(区间 贪心)
  6. 安卓应用安全指南 4.2.2 创建/使用广播接收器 规则书
  7. python安装轮子_自己动手造“轮子”---python常用的几个方法
  8. (转)Inno Setup入门(三)——指定压缩方式
  9. zoj 2706 线段树
  10. 关于吐槽网播放映兔源视频无法播放的问题 及解决方案
  11. paip.java c# .net php python调用c++ c dll so windows api 总结
  12. 05矩阵04——分块矩阵、分块矩阵的运算、分块矩阵的初等变换、分块初等矩阵的性质、按行分块、按列分块
  13. cs系统的服务器地址,《反恐精英CS》服务器地址
  14. 2023电工杯数学建模思路 - 复盘:校园消费行为分析
  15. 游泳各种姿势大全 -图文 【好东西收藏之】
  16. 七星配资创业板首创历史
  17. Y07-28D1-5010D 日本信浓步进马达 两相混合式步进电机驱动器组合
  18. 网络编程—IO多路复用详解
  19. idea2020.2 提示Cannot resolve method ‘xxxx‘ in ‘xxxxx‘
  20. 7779 - KKT基本算法304保龄球340

热门文章

  1. ethtool 命令输出的注意点--网卡参数
  2. 抽奖随机算法的技术探讨与C#实现
  3. [LeetCode]Balanced Binary Tree
  4. 如何解决“已有打开的与此命令相关联的 DataReader,必须首先将它关闭。”
  5. CCF202006-5 乔乔和牛牛逛超市【最大流】(100分题解链接)
  6. UVA12148 LA4214 Electricity【日期计算】
  7. Bailian2942 吃糖果【递推+打表】
  8. Bailian4117 简单的整数划分问题【整数划分+记忆化递归】
  9. 杭电OJ分类题目(4)-Graph
  10. 51Nod-1008 N的阶乘 mod P【模除】