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处理文件目录的相关方法
Oct 16 Python
Python中的列表生成式与生成器学习教程
Mar 13 Python
Django入门使用示例
Dec 12 Python
Tensorflow 自带可视化Tensorboard使用方法(附项目代码)
Feb 10 Python
Django读取Mysql数据并显示在前端的实例
May 27 Python
django初始化数据库的实例
May 27 Python
使用Python如何测试InnoDB与MyISAM的读写性能
Sep 18 Python
学习python分支结构
May 17 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
python 通过视频url获取视频的宽高方式
Dec 10 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
读取nii或nii.gz文件中的信息即输出图像操作
Jul 01 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
DOM XPATH获取img src值的query
2013/09/23 PHP
浅谈php扩展imagick
2014/06/02 PHP
Win7 64位系统下PHP连接Oracle数据库
2014/08/20 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
基础的prototype.js常用函数及其用法
2007/03/10 Javascript
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
jquery 层次选择器siblings与nextAll的区别介绍
2013/08/02 Javascript
jquery删除指定的html标签并保留标签内文本内容的方法
2014/04/02 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
jQuery中的jQuery()方法用法分析
2014/12/27 Javascript
JavaScript在浏览器标题栏上显示当前日期和时间的方法
2015/03/19 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
bootstrap jquery dataTable 异步ajax刷新表格数据的实现方法
2017/02/10 Javascript
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
基于AngularJS的简单使用详解
2017/09/10 Javascript
详解10分钟学会vue滚动行为
2017/09/21 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
js删除数组中某几项的方法总结
2019/01/16 Javascript
JS散列表碰撞处理、开链法、HashTable散列示例
2019/02/08 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
在Uni中使用Vue的EventBus总线机制操作
2020/07/31 Javascript
python使用range函数计算一组数和的方法
2015/05/07 Python
Python实现多进程共享数据的方法分析
2017/12/04 Python
解决pycharm的Python console不能调试当前程序的问题
2019/01/20 Python
Python3的高阶函数map,reduce,filter的示例详解
2019/07/23 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
Python基于time模块表示时间常用方法
2020/06/18 Python
香港太阳眼镜网上商店:SmartBuyGlasses香港
2016/07/22 全球购物
欧洲最大的高尔夫零售商:American Golf
2019/09/02 全球购物
Linux面试经常问的文件系统操作命令
2015/11/05 面试题
大学生先进事迹材料
2014/02/16 职场文书
产品推广策划方案
2014/05/10 职场文书
党的群众路线教育实践活动个人自我剖析材料
2014/10/07 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
清明节扫墓活动总结
2015/02/09 职场文书