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导出Excel图表以及导出为图片的方法
Nov 07 Python
python验证码识别的实例详解
Sep 09 Python
python中异常捕获方法详解
Mar 03 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
PyCharm设置护眼背景色的方法
Oct 29 Python
django主动抛出403异常的方法详解
Jan 04 Python
pyqt5 QProgressBar清空进度条的实例
Jun 21 Python
Python实现微信机器人的方法
Sep 06 Python
Python hashlib模块实例使用详解
Dec 24 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
Python自动化测试中yaml文件读取操作
Aug 20 Python
Matlab使用Plot函数实现数据动态显示方法总结
Feb 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 程序员应该使用的10个组件
2009/10/31 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
Laravel中的Blade模板引擎示例详解
2017/10/10 PHP
一个原生的用户等级的进度条
2010/07/03 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
快速学习jQuery插件 Form表单插件使用方法
2015/12/01 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
微信小程序中用WebStorm使用LESS
2017/03/08 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
Nodejs模块载入运行原理
2018/02/23 NodeJs
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
JavaScript实现多态和继承的封装操作示例
2018/08/20 Javascript
js代码实现轮播图
2020/05/04 Javascript
jQuery弹框插件使用方法详解
2020/05/26 jQuery
python显示天气预报
2014/03/02 Python
Python使用MD5加密字符串示例
2014/08/22 Python
Python调用微信公众平台接口操作示例
2017/07/08 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
windows下python安装pip图文教程
2018/05/25 Python
Django 实现Admin自动填充当前用户的示例代码
2019/11/18 Python
python绘制随机网络图形示例
2019/11/21 Python
Django如何重置migration的几种情景
2021/02/24 Python
护理专业学生的求职信范文
2013/12/11 职场文书
洗发露广告词
2014/03/14 职场文书
2014年劳动部工作总结
2014/12/11 职场文书
检讨书范文1000字
2015/01/28 职场文书
电影雨中的树观后感
2015/06/15 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
js Proxy的原理详解
2021/05/25 Javascript
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android