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 实现归并排序算法
Jun 05 Python
python求素数示例分享
Feb 16 Python
python中enumerate的用法实例解析
Aug 18 Python
python里大整数相乘相关技巧指南
Sep 12 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
bat和python批量重命名文件的实现代码
May 19 Python
Python黑魔法Descriptor描述符的实例解析
Jun 02 Python
python使用threading获取线程函数返回值的实现方法
Nov 15 Python
django创建最简单HTML页面跳转方法
Aug 16 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
Jan 19 Python
python3.x中安装web.py步骤方法
Jun 23 Python
Python基础教程,Python入门教程(超详细)
Jun 24 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 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
详解PHP原生DOM对象操作XML的方法
2016/10/17 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
PHP实现的解汉诺塔问题算法示例
2018/08/06 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
javascript 写类方式之八
2009/07/05 Javascript
jQuery调用WebService的实现代码
2011/06/19 Javascript
Angular2利用组件与指令实现图片轮播组件
2017/03/27 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
微信小程序 input表单与redio及下拉列表的使用实例
2017/09/20 Javascript
关于Google发布的JavaScript代码规范你要知道哪些
2018/04/04 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
微信小程序自定义模态弹窗组件详解
2019/12/24 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
[48:20]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python 图片验证码代码分享
2012/07/04 Python
python中的多线程实例教程
2014/08/27 Python
python处理PHP数组文本文件实例
2014/09/18 Python
Python进阶_关于命名空间与作用域(详解)
2017/05/29 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
2019/07/03 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
雅高酒店中国:Accorhotels.com China
2018/03/26 全球购物
法国购买隐形眼镜和眼镜网站:Optical Center
2019/10/08 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
品学兼优的大学生自我评价
2013/09/20 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
销售经理岗位职责
2014/03/16 职场文书
常务副总经理任命书
2014/06/05 职场文书
2014年村委会工作总结
2014/11/24 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL