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中的25个隐藏特性
Mar 30 Python
python实现的简单窗口倒计时界面实例
May 05 Python
详解Python中的array数组模块相关使用
Jul 05 Python
Python实现PS图像明亮度调整效果示例
Jan 23 Python
python使用requests模块实现爬取电影天堂最新电影信息
Apr 03 Python
使用Python进行中文繁简转换的实现代码
Oct 18 Python
pytorch: Parameter 的数据结构实例
Dec 31 Python
Python创建临时文件和文件夹
Aug 05 Python
python操作ini类型配置文件的实例教程
Oct 30 Python
五种Python转义表示法
Nov 27 Python
用python计算文件的MD5值
Dec 23 Python
一篇文章搞懂python混乱的切换操作与优雅的推导式
Aug 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判断密码强度的方法详解
2017/05/26 PHP
ThinkPHP 5.1 跨域配置方法
2019/10/11 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
一个简单的jquery进度条示例
2014/04/28 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
浅谈jQuery异步对象(XMLHttpRequest)
2014/11/17 Javascript
JS实现很实用的对联广告代码(可自适应高度)
2015/09/18 Javascript
chrome调试javascript详解
2015/10/21 Javascript
学习JavaScript设计模式(接口)
2015/11/26 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
angular-ui-sortable实现可拖拽排序列表
2016/12/28 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
2017/04/04 jQuery
详解webpack打包vue时提取css
2017/05/26 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
手把手教你写一个微信小程序(推荐)
2018/10/17 Javascript
JQuery Ajax执行跨域请求数据的解决方案
2018/12/10 jQuery
详解element-ui设置下拉选择切换必填和非必填
2019/06/17 Javascript
使用layui+ajax实现简单的菜单权限管理及排序的方法
2019/09/10 Javascript
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
Windows下Anaconda的安装和简单使用方法
2018/01/04 Python
修改python plot折线图的坐标轴刻度方法
2018/12/13 Python
Python:合并两个numpy矩阵的实现
2019/12/02 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
2020/01/13 Python
python——全排列数的生成方式
2020/02/26 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
德国大型的家具商店:Pharao24.de
2016/10/02 全球购物
马来西亚在线购物市场:PGMall.my
2019/10/13 全球购物
软件测试笔试题
2012/10/25 面试题
个人自我评价和职业目标
2014/01/24 职场文书
考试违纪检讨书
2014/02/02 职场文书
2014教师教育实践活动对照检查材料思想汇报
2014/09/21 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
干部考核工作总结
2015/08/12 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
MySQL 使用索引扫描进行排序
2021/06/20 MySQL