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

 更新时间:2017年11月22日 10:43:33   作者:Alex Yu  
这篇文章主要介绍了Python实现的堆排序算法,简单描述了堆排序的原理,并结合实例形式分析了Python实现堆排序的相关操作技巧,代码中备有较为详细的注释便于理解,需要的朋友可以参考下

本文实例讲述了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编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

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

相关文章

  • python模块简介之有序字典(OrderedDict)

    python模块简介之有序字典(OrderedDict)

    字典是Python开发中很常用的一种数据结构,但dict有个缺陷(其实也不算缺陷),迭代时并不是按照元素添加的顺序进行,可能在某些场景下,不能满足我们的要求。
    2016-12-12
  • python具名元组(namedtuple)的具体使用

    python具名元组(namedtuple)的具体使用

    本文主要介绍了python具名元组(namedtuple)的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python键盘输入转换为列表的实例

    Python键盘输入转换为列表的实例

    今天小编就为大家分享一篇Python键盘输入转换为列表的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 基于python的前后端分离的模拟实现

    基于python的前后端分离的模拟实现

    前后端分离核心是UI界面展示层(View)和数据处理层(Model)通过控制层(Controller)进行解耦合,在MVC设计模式中,前端主要负责数据展示和用户交互(View),后端处理业务逻辑和数据存储(Model),通过API接口进行通信,提高了开发效率,便于前后端分工合作,有利于代码的维护和迭代
    2024-10-10
  • Python if语句知识点用法总结

    Python if语句知识点用法总结

    本篇文章给python初学者总结了关于Python之if语句的相关用法以及知识点总结,跟着学习下吧。
    2018-06-06
  • django的聚合函数和aggregate、annotate方法使用详解

    django的聚合函数和aggregate、annotate方法使用详解

    这篇文章主要介绍了django的聚合函数和aggregate、annotate方法使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • 教你如何用Python实现人脸识别(含源代码)

    教你如何用Python实现人脸识别(含源代码)

    Python可以从图像或视频中检测和识别你的脸.人脸检测与识别是计算机视觉领域的研究热点之一.人脸识别的应用包括人脸解锁、安全防护等,医生和医务人员利用人脸识别来获取病历和病史,更好地诊断疾病,需要的朋友可以参考下
    2021-06-06
  • python 生成正态分布数据,并绘图和解析

    python 生成正态分布数据,并绘图和解析

    这篇文章主要介绍了python 生成正态分布数据,并绘图和解析,帮助大家更好的利用python进行数据分析,感兴趣的朋友可以了解下
    2020-12-12
  • Python字符串逆序输出的实例讲解

    Python字符串逆序输出的实例讲解

    今天小编就为大家分享一篇关于Python字符串逆序输出的实例讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • python 读取yaml文件的两种方法(在unittest中使用)

    python 读取yaml文件的两种方法(在unittest中使用)

    这篇文章主要介绍了python 读取yaml文件的两种方法(在unittest中使用),帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-12-12

最新评论