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 相关文章推荐
搞笑的程序猿:看看你是哪种Python程序员
Jun 12 Python
python简单获取数组元素个数的方法
Jul 13 Python
一张图带我们入门Python基础教程
Feb 05 Python
Python实现的爬虫功能代码
Jun 24 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 Python
我们为什么要减少Python中循环的使用
Jul 10 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 Python
属性与 @property 方法让你的python更高效
Sep 21 Python
Django admin组件的使用
Oct 24 Python
Pycharm 如何一键加引号的方法步骤
Feb 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中英混合字符串截取函数代码
2011/07/17 PHP
关于IIS php调用com组件的权限问题
2012/01/11 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
2013/06/03 PHP
PHP实现股票趋势图和柱形图
2015/02/07 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
PHP实现使用DOM将XML数据存入数组的方法示例
2017/09/27 PHP
PHP+Session防止表单重复提交的解决方法
2018/04/09 PHP
PHP终止脚本运行三种实现方法详解
2020/09/01 PHP
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
浅析js封装和作用域
2013/07/09 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
使用JavaScript获取地址栏参数的方法
2014/12/19 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
js实现圆盘记速表
2015/08/03 Javascript
JS生成和下载二维码的代码
2016/12/07 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
适合前端Vue开发童鞋的跨平台Weex的使用详解
2019/10/16 Javascript
vue2路由基本用法实例分析
2020/03/06 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
[01:30:55]VG vs Mineski Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
python操作摄像头截图实现远程监控的例子
2014/03/25 Python
在Python下进行UDP网络编程的教程
2015/04/29 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
Django中的Model操作表的实现
2018/07/24 Python
pyqt5实现按钮添加背景图片以及背景图片的切换方法
2019/06/13 Python
Python 爬取必应壁纸的实例讲解
2020/02/24 Python
Python创建简单的神经网络实例讲解
2021/01/04 Python
西班牙香水和化妆品网上商店:Douglas
2017/10/29 全球购物
德国净水壶和滤芯品牌:波尔德PearlCo(家用净水器)
2020/04/29 全球购物
成人大专自我鉴定范文
2013/10/19 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
银行见习期自我鉴定
2014/01/29 职场文书
2014年重阳节活动策划方案书
2014/09/16 职场文书
公司慰问信范文
2015/03/23 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python