Python实现堆排序的方法详解


Posted in Python onMay 03, 2016

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

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

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

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

PARENT(i):
    return i/2
LEFT(i):
    return 2i
RIGHT(i):
    return 2i+1

Python实现堆排序的方法详解

堆排序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 相关文章推荐
python中字典(Dictionary)用法实例详解
May 30 Python
python中ASCII码和字符的转换方法
Jul 09 Python
利用Python进行数据可视化常见的9种方法!超实用!
Jul 11 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
Python 微信爬虫完整实例【单线程与多线程】
Jul 06 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 Python
浅谈Python中的继承
Jun 19 Python
Python基于xlutils修改表格内容过程解析
Jul 28 Python
python-for x in range的用法(注意要点、细节)
May 10 Python
Python使用psutil库对系统数据进行采集监控的方法
Aug 23 Python
Python+pyaudio实现音频控制示例详解
Jul 23 Python
python web框架学习笔记
May 03 #Python
Python批量修改文本文件内容的方法
Apr 29 #Python
Python+Opencv识别两张相似图片
Mar 23 #Python
Python实现包含min函数的栈
Apr 29 #Python
Python二叉搜索树与双向链表转换实现方法
Apr 29 #Python
Python实现简单字典树的方法
Apr 29 #Python
Python中操作符重载用法分析
Apr 29 #Python
You might like
php array_walk() 数组函数
2011/07/12 PHP
使用PHPMyAdmin修复论坛数据库的图文方法
2012/01/09 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
PHP获取服务器端信息的方法
2014/11/28 PHP
浅谈PHP的反射API
2017/02/26 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
php 函数使用可变数量的参数方法
2017/05/02 PHP
php调用云片网接口发送短信的实现方法
2017/10/25 PHP
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
2007/08/13 Javascript
JavaScript 乱码问题
2009/08/06 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
jquery实现平滑的二级下拉菜单效果
2015/08/26 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
BootStrap selectpicker
2016/06/20 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
node.js爬虫爬取拉勾网职位信息
2017/03/14 Javascript
JavaScript限定范围拖拽及自定义滚动条应用(3)
2017/05/17 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
js实现从右往左匀速显示图片(无缝轮播)
2020/06/29 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
Python 文件和输入输出小结
2013/10/09 Python
python实现的简单FTP上传下载文件实例
2015/06/30 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
Python3.4解释器用法简单示例
2019/03/22 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
Django通过设置CORS解决跨域问题
2020/11/26 Python
Canvas 文本转粒子效果的实现代码
2019/02/14 HTML / CSS
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
Public Desire美国/加拿大:全球性的在线鞋类品牌
2018/12/17 全球购物
俄罗斯品牌服装在线商店:VIPAVENUE
2020/08/10 全球购物
感恩的演讲稿
2014/05/06 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
创业计划书之面包店
2019/09/12 职场文书
OpenCV3.3+Python3.6实现图片高斯模糊
2021/05/18 Python