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小程序
Aug 15 Python
Python中用Spark模块的使用教程
Apr 13 Python
python制作企业邮箱的爆破脚本
Oct 05 Python
Python使用Matplotlib实现雨点图动画效果的方法
Dec 23 Python
Python使用reportlab模块生成PDF格式的文档
Mar 11 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
Sep 30 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
Dec 12 Python
python发qq消息轰炸虐狗好友思路详解(完整代码)
Feb 15 Python
pandas中ix的使用详细讲解
Mar 09 Python
Pycharm打开已有项目配置python环境的方法
Jul 03 Python
python lambda的使用详解
Feb 26 Python
Python 数据科学 Matplotlib图库详解
Jul 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
php 无法加载mcrypt.dll的解决办法
2013/04/03 PHP
php实现自动获取生成文章主题关键词功能的深入分析
2013/06/03 PHP
Codeigniter整合Tank Auth权限类库详解
2014/06/12 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
2020/10/27 PHP
5 cool javascript apps
2007/03/24 Javascript
javascript进行四舍五入方法汇总
2014/12/16 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
Bootstrap模块dropdown实现下拉框响应
2016/05/22 Javascript
javascript基础知识讲解
2017/01/11 Javascript
JS中如何实现点击a标签返回页面顶部的问题
2017/01/19 Javascript
jQuery实现一个简单的轮播图
2017/02/19 Javascript
jQuery EasyUI Panel面板组件使用详解
2017/02/28 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
vue-swiper的使用教程
2018/08/30 Javascript
JS基于开关思想实现的数组去重功能【案例】
2019/02/18 Javascript
Vue设置长时间未操作登录自动到期返回登录页
2020/01/22 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
ES2020系列之空值合并运算符 '??'
2020/07/22 Javascript
python计算书页码的统计数字问题实例
2014/09/26 Python
浅谈python字典多键值及重复键值的使用
2016/11/04 Python
django上传图片并生成缩略图方法示例
2017/12/11 Python
Python函数中不定长参数的写法
2019/02/13 Python
python多线程同步实例教程
2019/08/11 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
使用python实现多维数据降维操作
2020/02/24 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
Sofmap官网:日本著名的数码电器专卖店
2017/05/19 全球购物
活动策划求职信模板
2014/04/21 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
银行授权委托书样本
2014/10/13 职场文书
学前班教学反思
2016/02/24 职场文书
CSS3 制作的悬停缩放特效
2021/04/13 HTML / CSS
php去除数组中为0的元素的实例分析
2021/11/17 PHP