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获取GY-85九轴模块信息示例
Dec 05 Python
Python pickle类库介绍(对象序列化和反序列化)
Nov 21 Python
Python类的专用方法实例分析
Jan 09 Python
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
用Python给文本创立向量空间模型的教程
Apr 23 Python
通过数据库对Django进行删除字段和删除模型的操作
Jul 21 Python
解决安装python库时windows error5 报错的问题
Oct 21 Python
浅谈pyqt5中信号与槽的认识
Feb 17 Python
Python求正态分布曲线下面积实例
Nov 20 Python
Python实现密码薄文件读写操作
Dec 16 Python
基于Tensorflow的MNIST手写数字识别分类
Jun 17 Python
Python first-order-model实现让照片动起来
Jun 25 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中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
使用array mutisort 实现按某字段对数据排序
2013/06/18 PHP
各种快递查询--Api接口
2016/04/26 PHP
php截取视频指定帧为图片
2016/05/16 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
PHP实现简单的计算器
2020/08/28 PHP
精解window.setTimeout()&amp;window.setInterval()使用方式与参数传递问题!
2007/11/23 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
jQuery实现点击该行即可删除HTML表格行
2014/10/17 Javascript
前端必备神器 Snap.svg 弹动效果
2014/11/10 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
2015/04/07 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
Vue.js原理分析之observer模块详解
2017/02/17 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
[04:26]2014DOTA2国际邀请赛-Newbee顺利进入胜者组决赛 独家专访战神7
2014/07/19 DOTA
[47:45]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第一场 2月26日
2021/03/11 DOTA
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
Python 爬虫之超链接 url中含有中文出错及解决办法
2017/08/03 Python
python中is与双等于号“==”的区别示例详解
2017/11/21 Python
自学python的建议和周期预算
2019/01/30 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
Python中如何引入第三方模块
2020/05/27 Python
浅谈python 调用open()打开文件时路径出错的原因
2020/06/05 Python
通过自学python能找到工作吗
2020/06/21 Python
python使用布隆过滤器的实现示例
2020/08/20 Python
paramiko使用tail实时获取服务器的日志输出详解
2020/12/06 Python
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
美国非常受欢迎的Spa品牌:Bliss必列斯
2018/04/10 全球购物
《圆明园的毁灭》教学反思
2014/02/28 职场文书
面试自我评价范文
2014/09/17 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
2014年大学生工作总结
2014/11/20 职场文书
golang json数组拼接的实例
2021/04/28 Golang
MySQL 数据丢失排查案例
2021/05/08 MySQL