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 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
HTML中使用python屏蔽一些基本功能的方法
Jul 07 Python
django在接受post请求时显示403forbidden实例解析
Jan 25 Python
Python输出由1,2,3,4组成的互不相同且无重复的三位数
Feb 01 Python
TensorFlow变量管理详解
Mar 10 Python
Python闭包和装饰器用法实例详解
May 22 Python
Django中自定义模型管理器(Manager)及方法
Sep 23 Python
python对Excel按条件进行内容补充(推荐)
Nov 24 Python
python异常处理、自定义异常、断言原理与用法分析
Mar 23 Python
python让函数不返回结果的方法
Jun 22 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
浅谈Python基础之列表那些事儿
May 11 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
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
用PHP和ACCESS写聊天室(四)
2006/10/09 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
php多种形式发送邮件(mail qmail邮件系统 phpmailer类)
2014/01/22 PHP
PHP实现小偷程序实例
2016/10/31 PHP
php可变长参数处理函数详解
2017/02/22 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
对xmlHttp对象的理解
2011/01/17 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
jQuery :first选择器使用介绍
2013/08/09 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
javascript 实现 原路返回
2015/01/21 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
EasyUI的DataGrid每行数据添加操作按钮的实现代码
2017/08/22 Javascript
微信小程序tabBar用法实例详解
2017/12/04 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
JS实现canvas简单小画板功能
2020/06/23 Javascript
Vue+scss白天和夜间模式切换功能的实现方法
2021/01/05 Vue.js
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
Python浅复制中对象生存周期实例分析
2018/04/02 Python
Python元组知识点总结
2019/02/18 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
解决Django部署设置Debug=False时xadmin后台管理系统样式丢失
2020/04/07 Python
pycharm 快速解决python代码冲突的问题
2021/01/15 Python
Python操作Excel的学习笔记
2021/02/18 Python
后勤主管工作职责
2013/12/07 职场文书
幼儿园教师培训制度
2014/01/16 职场文书
《与象共舞》教学反思
2014/02/24 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
国际商务专业求职信
2014/07/15 职场文书
2015新员工试用期工作总结
2014/12/12 职场文书
个人年终总结怎么写
2015/03/09 职场文书
2015年教师党员承诺书
2015/04/27 职场文书
AJAX实现省市县三级联动效果
2021/10/16 Javascript