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内置的字符串处理函数整理
Jan 29 Python
独特的python循环语句
Nov 20 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
使用python opencv对目录下图片进行去重的方法
Jan 12 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
Jan 15 Python
python装饰器简介---这一篇也许就够了(推荐)
Apr 01 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 Python
python 实现从高分辨图像上抠取图像块
Jan 02 Python
OpenCV python sklearn随机超参数搜索的实现
Jan 17 Python
Python调用.net动态库实现过程解析
Jun 05 Python
python如何控制进程或者线程的个数
Oct 16 Python
python 利用opencv实现图像网络传输
Nov 12 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也可以?成Shell Script
2006/10/09 PHP
yii框架中的Url生产问题小结
2012/01/16 PHP
Mac版PhpStorm之XAMPP整合apache服务器配置的图文教程详解
2016/10/13 PHP
快速解决PHP调用Word组件DCOM权限的问题
2017/12/27 PHP
PHP序列化的四种实现方法与横向对比
2018/11/29 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
Jquery 滑入滑出效果实现代码
2010/03/27 Javascript
jQuery select操作控制方法小结
2010/05/26 Javascript
Jquery CheckBox全选方法代码附js checkbox全选反选代码
2010/06/09 Javascript
简约JS日历控件 实例代码
2013/07/12 Javascript
JS正则验证邮箱的格式详细介绍
2013/11/19 Javascript
Jquery实现简单的轮播效果(代码管用)
2016/03/14 Javascript
angularjs实现的前端分页控件示例
2017/02/10 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
代码详解javascript模块加载器
2018/03/04 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
微信小程序倒计时功能实例代码
2018/07/17 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
简单了解JavaScript sort方法
2019/11/25 Javascript
微信小程序返回上一级页面的实现代码
2020/06/19 Javascript
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
Python执行时间的计算方法小结
2017/03/17 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
python实现将多个文件分配到多个文件夹的方法
2019/01/07 Python
详解Python学习之安装pandas
2019/04/16 Python
python监控nginx端口和进程状态
2019/09/06 Python
python简单实现9宫格图片实例
2020/09/03 Python
艺校音乐专业自我鉴定范文
2014/03/01 职场文书
购房协议书范本
2014/04/11 职场文书
关于环保的建议书
2014/05/12 职场文书
2014年毕业演讲稿范文
2014/05/13 职场文书
2014年纪检监察工作总结
2014/11/11 职场文书
值班管理制度范本
2015/08/06 职场文书
教师学习十八届五中全会精神心得体会
2016/01/05 职场文书
如何写好竞聘报告
2019/04/03 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书