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基础练习之几个简单的游戏
Nov 10 Python
Python实现上下班抢个顺风单脚本
Feb 07 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
Python实现K折交叉验证法的方法步骤
Jul 11 Python
Python中 Global和Nonlocal的用法详解
Jan 20 Python
opencv python图像梯度实例详解
Feb 04 Python
python读写文件write和flush的实现方式
Feb 21 Python
简单了解django处理跨域请求最佳解决方案
Mar 25 Python
Python容器类型公共方法总结
Aug 19 Python
Python识别处理照片中的条形码
Nov 16 Python
Python的这些库,你知道多少?
Jun 09 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中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
PHP函数篇详解十进制、二进制、八进制和十六进制转换函数说明
2011/12/05 PHP
PHP实现仿Google分页效果的分页函数
2015/07/29 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
jQuery timers计时器简单应用说明
2010/10/28 Javascript
Javascript拓展String方法小结
2013/07/08 Javascript
jquery队列queue与原生模仿其实现方法分享
2014/03/25 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
第一次接触神奇的Bootstrap
2016/10/14 Javascript
jsTree使用记录实例
2016/12/01 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
解决jQuery ajax动态新增节点无法触发点击事件的问题
2017/05/24 jQuery
小发现之浅谈location.search与location.hash的问题
2017/06/23 Javascript
JS实现的汉字与Unicode码相互转化功能分析
2018/05/25 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
vue 动态组件(component :is) 和 dom元素限制(is)用法说明
2020/09/04 Javascript
Vue解决移动端弹窗滚动穿透问题
2020/12/15 Vue.js
el-table表头根据内容自适应完美解决表头错位和固定列错位
2021/01/07 Javascript
jupyter notebook引用from pyecharts.charts import Bar运行报错
2020/04/23 Python
Python实现快速计算词频功能示例
2018/06/25 Python
对Python _取log的几种方式小结
2019/07/25 Python
Brother加拿大官网:打印机、贴标机、缝纫机
2019/10/09 全球购物
MUGLER官方网站:蒂埃里·穆勒香水
2019/11/26 全球购物
递归实现回文判断(如:abcdedbca就是回文,判断一个面试者对递归理解的简单程序)
2013/04/28 面试题
平面网站制作专科生的自我评价分享
2013/12/11 职场文书
医药代表个人求职信范本
2013/12/19 职场文书
英语道歉信范文
2014/01/09 职场文书
医院实习接收函
2014/01/12 职场文书
餐饮业经理竞聘演讲稿
2014/01/14 职场文书
班子群众路线教育实践个人对照检查材料思想汇报
2014/09/30 职场文书
庆六一宣传标语
2014/10/08 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
莫言获奖感言(全文)
2015/07/31 职场文书
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技