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编程中的文件操作攻略
Oct 16 Python
详解django中自定义标签和过滤器
Jul 03 Python
selenium3+python3环境搭建教程图解
Dec 07 Python
pandas去重复行并分类汇总的实现方法
Jan 29 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
python自动发微信监控报警
Sep 06 Python
python多环境切换及pyenv使用过程详解
Sep 27 Python
wxpython绘制音频效果
Nov 18 Python
Python3 中sorted() 函数的用法
Mar 24 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
matlab、python中矩阵的互相导入导出方式
Jun 01 Python
Pycharm github配置实现过程图解
Oct 13 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中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
jscript之Read an Excel Spreadsheet
2007/06/13 Javascript
javascript 进度条 实现代码
2009/07/30 Javascript
js中settimeout方法加参数的使用实例
2014/02/27 Javascript
纯js实现重发验证码按钮倒数功能
2015/04/21 Javascript
Nodejs中的this详解
2016/03/26 NodeJs
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
jQuery新窗口打开外链接
2016/07/21 Javascript
ES6新特性之解构、参数、模块和记号用法示例
2017/04/01 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
Angularjs上传文件组件flowjs功能
2017/08/07 Javascript
jQuery中元素选择器(element)简单用法示例
2018/05/14 jQuery
详解如何使用webpack打包JS
2018/06/21 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
jQuery操作attr、prop、val()/text()/html()、class属性
2019/05/23 jQuery
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
使用Python的PIL模块来进行图片对比
2016/02/18 Python
python用户评论标签匹配的解决方法
2018/05/31 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
2019/06/25 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
PyTorch中permute的用法详解
2019/12/30 Python
python numpy数组中的复制知识解析
2020/02/03 Python
纯html5+css3下拉导航菜单实现代码
2013/03/18 HTML / CSS
彪马荷兰官网:PUMA荷兰
2019/05/08 全球购物
开朗女孩的自我评价
2014/02/10 职场文书
保险公司晨会主持词
2014/03/22 职场文书
教师个人读书活动总结
2014/07/08 职场文书
四风问题自查自纠工作情况报告
2014/10/28 职场文书
手把手教你怎么用Python实现zip文件密码的破解
2021/05/27 Python