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 判断 有向图 是否有环的实例讲解
Feb 01 Python
PyCharm设置SSH远程调试的方法
Jul 17 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
python logging日志模块原理及操作解析
Oct 12 Python
python元组和字典的内建函数实例详解
Oct 22 Python
python shell命令行中import多层目录下的模块操作
Mar 09 Python
给keras层命名,并提取中间层输出值,保存到文档的实例
May 23 Python
Python通过kerberos安全认证操作kafka方式
Jun 06 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 Python
Python实现Kerberos用户的增删改查操作
Dec 14 Python
python中reload重载实例用法
Dec 15 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
投票管理程序
2006/10/09 PHP
PHP技术开发技巧分享
2010/03/23 PHP
深入Memcache的Session数据的多服务器共享详解
2013/06/13 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
php实现爬取和分析知乎用户数据
2016/01/26 PHP
php脚本守护进程原理与实现方法详解
2017/07/20 PHP
使用ucenter实现多站点同步登录的讲解
2019/03/21 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
js过滤数组重复元素的方法
2010/09/05 Javascript
jQuery处理xml格式的返回数据(实例解析)
2013/11/28 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
js实现简单随机抽奖的方法
2015/01/27 Javascript
微信JS-SDK选取手机照片上传功能
2017/04/21 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
React路由管理之React Router总结
2018/05/10 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
详解mpvue实现对苹果X安全区域的适配
2019/07/31 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
[55:54]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python 绘图和可视化详细介绍
2017/02/11 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
解决Django连接db遇到的问题
2019/08/29 Python
Python目录和文件处理总结详解
2019/09/02 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
matplotlib交互式数据光标实现(mplcursors)
2021/01/13 Python
canvas线条的属性详解
2018/03/27 HTML / CSS
环境保护建议书
2014/08/26 职场文书
写给纪委的违纪检讨书
2015/05/05 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
装修公司管理制度
2015/08/05 职场文书
简短清晨问候语
2015/11/10 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android