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如何实现远程控制电脑(结合微信)
Dec 21 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
Numpy数组的保存与读取方法
Apr 04 Python
Python实现合并两个列表的方法分析
May 28 Python
让代码变得更易维护的7个Python库
Oct 09 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
Python检查ping终端的方法
Jan 26 Python
使用selenium模拟登录解决滑块验证问题的实现
May 10 Python
python用for循环求和的方法总结
Jul 08 Python
使用python实现多维数据降维操作
Feb 24 Python
Python 如何实现数据库表结构同步
Sep 29 Python
基于注解实现 SpringBoot 接口防刷的方法
Mar 02 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禁止个别IP访问网站
2013/10/30 PHP
PHP下载远程文件到本地存储的方法
2015/03/24 PHP
Zend Framework开发入门经典教程
2016/03/23 PHP
使用PHP开发留言板功能
2019/11/19 PHP
Javascript hasOwnProperty 方法 &amp; in 关键字
2008/11/26 Javascript
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
精通JavaScript 纠正 cleanWhitespace函数
2010/03/11 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
jquery中常用的函数和属性详细解析
2014/03/07 Javascript
ExpressJS入门实例
2015/01/14 Javascript
Javascript中使用parseInt函数需要注意的问题
2015/04/02 Javascript
用JavaScript实现PHP的urlencode与urldecode函数
2015/08/13 Javascript
bootstrap表格分页实例讲解
2016/12/30 Javascript
AngularJS入门教程一:路由用法初探
2017/05/27 Javascript
js实现HTML中Select二级联动的实例
2018/01/05 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
vue+moment实现倒计时效果
2019/08/26 Javascript
JavaScript中如何调用Java方法
2020/09/16 Javascript
vue下载二进制流图片操作
2020/10/26 Javascript
Vue实现购物小球抛物线的方法实例
2020/11/22 Vue.js
Python socket网络编程TCP/IP服务器与客户端通信
2017/01/05 Python
Python实现Kmeans聚类算法
2020/06/10 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
业务部经理岗位职责
2014/01/04 职场文书
投标诚信承诺书
2014/05/26 职场文书
学籍证明模板
2014/11/21 职场文书
2014年安全管理工作总结
2014/12/01 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
公司档案管理制度
2015/08/05 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
SQL Server中使用表变量和临时表
2022/05/20 SQL Server
DQL数据查询语句使用示例
2022/12/24 MySQL