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脚本实时处理log文件的方法
Nov 21 Python
Python3实现转换Image图片格式
Jun 21 Python
对Python中数组的几种使用方法总结
Jun 28 Python
python删除字符串中指定字符的方法
Aug 13 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
python操作文件的参数整理
Jun 11 Python
详解Pycharm安装及Django安装配置指南
Sep 15 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
Nov 13 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
Pycharm plot独立窗口显示的操作
Dec 11 Python
python Polars库的使用简介
Apr 21 Python
Python+SeaTable实现计算两个日期间的工作日天数
Jul 07 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
Bo-Blog专用的给Windows服务器的IIS Rewrite程序
2007/08/26 PHP
简单PHP上传图片、删除图片实现代码
2010/05/12 PHP
php学习笔记之 函数声明(二)
2011/06/09 PHP
PHP处理会话函数大总结
2015/08/05 PHP
深入解析PHP中foreach语句控制数组循环的用法
2015/11/30 PHP
浅谈Laravel队列实现原理解决问题记录
2017/08/19 PHP
Laravel5.5+ 使用API Resources快速输出自定义JSON方法详解
2020/04/06 PHP
让新消息在网页标题闪烁提示的jQuery代码
2013/11/04 Javascript
jquery $.trim()方法使用介绍
2014/05/21 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
jQuery操作css样式
2017/05/15 jQuery
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
微信小程序整合使用富文本编辑器的方法详解
2019/04/25 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
Vue3配置axios跨域实现过程解析
2020/11/25 Vue.js
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
Python3 中文文件读写方法
2018/01/23 Python
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
python实现监控某个服务 服务崩溃即发送邮件报告
2018/06/21 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
python正则表达式匹配不包含某几个字符的字符串方法
2019/07/23 Python
八年级语文教学反思
2014/02/11 职场文书
2014社区三八妇女节活动方案
2014/03/30 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
入职担保书范文
2014/05/21 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
学历证明范文
2015/06/16 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android
Android自定义双向滑动控件
2022/04/19 Java/Android