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中的条件判断语句与循环语句用法小结
Mar 21 Python
机器学习10大经典算法详解
Dec 07 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
python 3.7.0 安装配置方法图文教程
Aug 27 Python
Python面向对象之继承和多态用法分析
Jun 08 Python
python处理大日志文件
Jul 23 Python
详解python statistics模块及函数用法
Oct 27 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
Feb 26 Python
Python标准库shutil模块使用方法解析
Mar 10 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
使用Django的JsonResponse返回数据的实现
Jan 15 Python
Django + Taro 前后端分离项目实现企业微信登录功能
Apr 07 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
ThinkPHP实现动态包含文件的方法
2014/11/29 PHP
php判断当前用户已在别处登录的方法
2015/01/06 PHP
PHP函数extension_loaded()用法实例
2015/01/19 PHP
浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)
2015/09/22 PHP
JSON两种结构之对象和数组的理解
2016/07/19 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
js字符编码函数区别分析
2011/12/28 Javascript
jquery1.83 之前所有与异步列队相关的模块详细介绍
2012/11/13 Javascript
原生js事件的添加和删除的封装
2014/07/01 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
一步步教大家编写酷炫的导航栏js+css实现
2016/03/14 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
Angular4 中常用的指令入门总结
2017/06/12 Javascript
AngularJS 最常用的八种功能(基础知识)
2017/06/26 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
CKEditor4配置与开发详细中文说明文档
2018/10/08 Javascript
Python中字典的基本知识初步介绍
2015/05/21 Python
Python使用ftplib实现简易FTP客户端的方法
2015/06/03 Python
python基于twisted框架编写简单聊天室
2018/01/02 Python
python 检查文件mime类型的方法
2018/12/08 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
Django框架models使用group by详解
2020/03/11 Python
Python如何实现线程间通信
2020/07/30 Python
Python基于template实现字符串替换
2020/11/27 Python
socket.io 和canvas 实现的共享画板功能
2019/05/22 HTML / CSS
html5使用canvas画一条线
2014/12/15 HTML / CSS
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
公司人事专员岗位职责
2014/08/11 职场文书
教师批评与自我批评
2014/10/15 职场文书
新生入学欢迎词
2015/01/26 职场文书
小学教师求职信范文
2015/03/20 职场文书
《金色的草地》教学反思
2016/02/17 职场文书
导游词之江西赣州
2019/10/15 职场文书
Python办公自动化之教你如何用Python将任意文件转为PDF格式
2021/06/28 Python