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 生成目录树及显示文件大小的代码
Jul 23 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
Python内置random模块生成随机数的方法
May 31 Python
pycharm配置git(图文教程)
Aug 16 Python
python网络编程之多线程同时接受和发送
Sep 03 Python
python生成特定分布数的实例
Dec 05 Python
python实现提取COCO,VOC数据集中特定的类
Mar 10 Python
python线性插值解析
Jul 05 Python
Python request post上传文件常见要点
Nov 20 Python
Python绘制分类图的方法
Apr 20 Python
python3.9之你应该知道的新特性详解
Apr 29 Python
python中的装饰器该如何使用
Jun 18 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输出时间格式
2013/08/31 PHP
Javascript SHA-1:Secure Hash Algorithm
2006/12/20 Javascript
JavaScript中的变量声明早于赋值分析
2012/03/01 Javascript
Vuejs实现购物车功能
2017/11/05 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
ES6 fetch函数与后台交互实现
2018/11/14 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
vue使用微信扫一扫功能的实现代码
2020/04/11 Javascript
[03:36]2014DOTA2 TI小组赛综述 八强诞生进军钥匙球馆
2014/07/15 DOTA
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python如何爬取个性签名
2018/06/19 Python
详解Python静态网页爬取获取高清壁纸
2019/04/23 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
python向图片里添加文字
2019/11/26 Python
Django 解决由save方法引发的错误
2020/05/21 Python
opencv 实现特定颜色线条提取与定位操作
2020/06/02 Python
python3中确保枚举值代码分析
2020/12/02 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
联想墨西哥官方网站:Lenovo墨西哥
2016/08/17 全球购物
印尼最大的婴儿用品购物网站:Orami
2017/09/28 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
TCP/IP的分层模型
2013/10/27 面试题
EJB timer的种类
2014/10/28 面试题
简单的JAVA编程面试题
2013/03/19 面试题
建筑专业自荐信范文
2014/01/05 职场文书
实习生自我评价
2014/01/18 职场文书
大家访活动实施方案
2014/03/10 职场文书
2015年财务试用期工作总结
2014/12/24 职场文书
总经理年会致辞
2015/07/29 职场文书
中国式结婚:司仪主持词(范文)
2019/07/25 职场文书
python爬虫--selenium模块
2021/03/31 Python