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切换hosts文件代码示例
Dec 31 Python
Python中尝试多线程编程的一个简明例子
Apr 07 Python
合并百度影音的离线数据( with python 2.3)
Aug 04 Python
Python随手笔记之标准类型内建函数
Dec 02 Python
在Python中移动目录结构的方法
Jan 31 Python
5款非常棒的Python工具
Jan 05 Python
通过Pandas读取大文件的实例
Jun 07 Python
python 美化输出信息的实例
Oct 15 Python
pytorch:model.train和model.eval用法及区别详解
Feb 20 Python
django queryset相加和筛选教程
May 18 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
Python pandas求方差和标准差的方法实例
Aug 04 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
德生S2000南麂列岛台湾FM收听记录
2021/03/02 无线电
PHP中把有符号整型转换为无符号整型方法
2015/05/27 PHP
深入讲解PHP Session及如何保持其不过期的方法
2015/08/18 PHP
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
javascript特效实现——当前时间和倒计时效果的简单实例
2016/07/20 Javascript
Angular JS 生成动态二维码的方法
2017/02/23 Javascript
jQuery 防止相同的事件快速重复触发方法
2018/02/08 jQuery
Vue页面骨架屏注入方法
2018/05/13 Javascript
vue .sync修饰符的使用详解
2018/06/15 Javascript
JavaScript如何判断对象有某属性
2020/07/03 Javascript
vue循环中点击选中再点击取消(单选)的实现
2020/09/10 Javascript
[40:55]DOTA2上海特级锦标赛主赛事日 - 2 败者组第二轮#4Newbee VS Fnatic
2016/03/03 DOTA
[03:30]DOTA2完美“圣”典精彩集锦
2016/12/27 DOTA
python基于ID3思想的决策树
2018/01/03 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
python实现多线程行情抓取工具的方法
2018/02/28 Python
python pandas.DataFrame选取、修改数据最好用.loc,.iloc,.ix实现
2018/06/11 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
pycharm远程开发项目的实现步骤
2019/01/20 Python
python判断元素是否存在的实例方法
2020/09/24 Python
Python-openpyxl表格读取写入的案例详解
2020/11/02 Python
详解css3 flex弹性盒自动铺满写法
2020/09/17 HTML / CSS
HTML5文档结构标签
2017/04/21 HTML / CSS
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
信息管理员岗位职责
2013/12/01 职场文书
信息技术毕业生自荐信范文
2014/03/13 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
婚庆答谢词
2015/01/04 职场文书
感谢信怎么写
2015/01/21 职场文书
幼儿园个人总结
2015/02/28 职场文书
教师读书活动心得体会
2016/01/14 职场文书
《海上日出》教学反思
2016/02/23 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书