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 相关文章推荐
用map函数来完成Python并行任务的简单示例
Apr 02 Python
Python中的面向对象编程详解(下)
Apr 13 Python
Python读写及备份oracle数据库操作示例
May 17 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
django将数组传递给前台模板的方法
Aug 06 Python
pyinstaller还原python代码过程图解
Jan 08 Python
Python 实现将数组/矩阵转换成Image类
Jan 09 Python
TensorFlow tensor的拼接实例
Jan 19 Python
python模拟预测一下新型冠状病毒肺炎的数据
Feb 01 Python
Python之关于类变量的两种赋值区别详解
Mar 12 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
python 实现图片特效处理
Apr 03 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对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
PHP设计模式之解释器模式的深入解析
2013/06/13 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
jQuery实用密码强度检测
2017/03/02 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
2017/07/04 jQuery
Vue中引入样式文件的方法
2017/08/18 Javascript
javaScript之split与join的区别(详解)
2017/11/08 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
微信小程序使用swiper组件实现类3D轮播图
2018/08/29 Javascript
Vue混入mixins滚动触底的方法
2019/11/22 Javascript
vue用elementui写form表单时,在label里添加空格操作
2020/08/13 Javascript
Python深入学习之内存管理
2014/08/31 Python
Python中操作MySQL入门实例
2015/02/08 Python
python中循环语句while用法实例
2015/05/16 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
Python正则表达式知识汇总
2017/09/22 Python
python 循环读取txt文档 并转换成csv的方法
2018/10/26 Python
在python中利用opencv简单做图片比对的方法
2019/01/24 Python
Python求均值,方差,标准差的实例
2019/06/29 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
俄罗斯韩国化妆品网上商店:Cosmasi.ru
2019/10/31 全球购物
哪些情况下不应该使用索引
2015/07/20 面试题
自荐书格式
2013/12/01 职场文书
公益广告宣传方案
2014/02/28 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
2015年宣传部工作总结范文
2015/03/31 职场文书
暑期辅导班宣传单
2015/07/14 职场文书