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网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
更改Python命令行交互提示符的方法
Jan 14 Python
Windows和Linux下使用Python访问SqlServer的方法介绍
Mar 10 Python
Python字符串格式化
Jun 15 Python
python基础教程之分支、循环简单用法
Jun 16 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
Feb 11 Python
python基于SMTP协议发送邮件
May 31 Python
Django model update的多种用法介绍
Mar 28 Python
python 等差数列末项计算方式
May 03 Python
Python 操作SQLite数据库的示例
Oct 16 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
Python基础详解之邮件处理
Apr 28 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的日期与时间函数技巧
2008/04/24 PHP
destoon复制新模块的方法
2014/06/21 PHP
PHP实现数据库的增删查改功能及完整代码
2018/04/18 PHP
Yii 使用intervention/image拓展实现图像处理功能
2019/06/22 PHP
JS效率个人经验谈(8-15更新),加入range技巧
2007/01/09 Javascript
Prototype中dom对象方法汇总
2008/09/17 Javascript
JavaScript 实现模态对话框 源代码大全
2009/05/02 Javascript
原生js做的手风琴效果的导航菜单
2013/11/08 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
JS比较两个时间大小的简单示例代码
2013/12/20 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
js打造数组转json函数
2015/01/14 Javascript
jQuery替换节点用法示例(使用replaceWith方法)
2016/09/08 Javascript
Bootstrap 3的box-sizing样式导致UEditor控件的图片无法正常缩放的解决方案
2016/09/15 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
vue组件实现文字居中对齐的方法
2017/08/23 Javascript
javascript性能优化之分时函数的介绍
2018/03/28 Javascript
超详细动手搭建一个VuePress 站点及开启PWA与自动部署的方法
2019/01/27 Javascript
Python开发微信公众平台的方法详解【基于weixin-knife】
2017/07/08 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
基于MTCNN/TensorFlow实现人脸检测
2018/05/24 Python
Python图像处理之颜色的定义与使用分析
2019/01/03 Python
pytorch GAN生成对抗网络实例
2020/01/10 Python
基于python3实现倒叙字符串
2020/02/18 Python
HTML5 SEO优化的一些建议
2020/08/27 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
高街生活方式全球在线商店:AZBRO
2017/08/26 全球购物
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
阿迪达斯英国官方网站:adidas英国
2019/08/13 全球购物
小学新学期寄语
2014/04/02 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
公司优秀员工获奖感言
2014/08/14 职场文书
教师工作决心书
2015/02/04 职场文书
2016新教师岗前培训心得体会
2016/01/08 职场文书
利用JuiceFS使MySQL 备份验证性能提升 10 倍
2022/03/17 MySQL
python中字符串String及其常见操作指南(方法、函数)
2022/04/06 Python