Python实现的堆排序算法原理与用法实例分析


Posted in Python onNovember 22, 2017

本文实例讲述了Python实现的堆排序算法。分享给大家供大家参考,具体如下:

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

具体代码如下:

#-*- coding: UTF-8 -*-
import numpy as np
def MakeHeap(a):
  for i in xrange(a.size / 2 - 1, -1, -1):#对非叶子节点的子节点进行调节,构建堆
    AdjustHeap(a, i, a.size)
def AdjustHeap(a, i, n):
  j = i*2 +1                     #选择节点i的左子节点
  x = a[i]                       #选择节点的数值
  while j < n:                    #循环对子节点及其子树进行调整
    if j + 1 < n and a[j+1] < a[j]:    #找到节点i子节点的最小值
      j += 1
    if a[j] >= x :                  #若两个子节点均不小于该节点,则不同调整
      break
    a[i], a[j] = a[j], a[i]             #将节点i的数值与其子节点中最小者的数值进行对调
    i = j                        #将i赋为改变的子节点的索引
    j = i*2 + 1                   #将j赋为节点对应的左子节点
def HeapSort(a):
  MakeHeap(a)                 #构建小顶堆
  for i in xrange(a.size - 1,0, -1):   #对堆中的元素逆向遍历
    a[i], a[0] = a[0], a[i]           #将堆顶元素与堆中最后一个元素进行对调,因为小顶堆中堆顶元素永远最小,因此,输出即为最小元素
    AdjustHeap(a, 0, i)          #重新调整使剩下的元素仍为一个堆
if __name__ == '__main__':
  a = np.random.randint(0, 10, size = 10)
  print "Before sorting..."
  print "---------------------------------------------------------------"
  print a
  print "---------------------------------------------------------------"
  HeapSort(a)
  print "After sorting..."
  print "---------------------------------------------------------------"
  print a[::-1]                    #因为堆排序按大到小进行排列,采用a[::-1]对其按从小到大进行输出
  print "---------------------------------------------------------------"

运行结果:

Python实现的堆排序算法原理与用法实例分析

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
50行代码实现贪吃蛇(具体思路及代码)
Apr 27 Python
python笔记:mysql、redis操作方法
Jun 28 Python
详解 Python 读写XML文件的实例
Aug 02 Python
Python进度条实时显示处理进度的示例代码
Jan 30 Python
Python从零开始创建区块链
Mar 06 Python
手把手教你如何安装Pycharm(详细图文教程)
Nov 28 Python
树莓派采用socket方式文件传输(python)
Jun 22 Python
python 生成器和迭代器的原理解析
Oct 12 Python
Python unittest 自动识别并执行测试用例方式
Mar 09 Python
python让函数不返回结果的方法
Jun 22 Python
python编写实现抽奖器
Sep 10 Python
Python编程源码报错解决方法总结经验分享
Oct 05 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 #Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 #Python
Python实现桶排序与快速排序算法结合应用示例
Nov 22 #Python
解决python3中自定义wsgi函数,make_server函数报错的问题
Nov 21 #Python
python不换行之end=与逗号的意思及用途
Nov 21 #Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
Nov 21 #Python
pycharm远程调试openstack代码
Nov 21 #Python
You might like
解析php中array_merge与array+array的区别
2013/06/21 PHP
php-fpm中max_children的配置
2019/03/15 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
2019/08/23 PHP
由浅到深了解JavaScript类
2006/09/08 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
2013/06/18 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
Web前端新人笔记之jquery入门心得(新手必看)
2016/05/17 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
jquery动态添加以及遍历option并获取特定样式名称的option方法
2018/01/29 jQuery
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
vue项目中axios请求网络接口封装的示例代码
2018/12/18 Javascript
vue和better-scroll实现列表左右联动效果详解
2019/04/29 Javascript
vue通过v-html指令渲染的富文本无法修改样式的解决方案
2020/05/20 Javascript
Python的垃圾回收机制深入分析
2014/07/16 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
详解anaconda安装步骤
2020/11/23 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
html5 Canvas画图教程(10)—把面拆成线条模拟出圆角矩形
2013/01/09 HTML / CSS
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
Kangol帽子官网:坎戈尔袋鼠
2018/09/26 全球购物
NFL欧洲商店(德国):NFL Europe Shop DE
2018/11/03 全球购物
大学生村官心得体会范文
2014/01/04 职场文书
《云房子》教学反思
2014/04/20 职场文书
3分钟英语演讲稿
2014/04/29 职场文书
捐款活动总结
2014/08/27 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
2015财务年度工作总结范文
2015/05/04 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
MySql存储过程之逻辑判断和条件控制
2021/05/26 MySQL