侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python下实现二叉堆以及堆排序的示例

Python  /  管理员 发布于 7年前   133

堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序。堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势。

堆分为大头堆和小头堆, 正如其名, 大头堆的第一个元素是最大的, 每个有子结点的父结点, 其数据值都比其子结点的值要大。小头堆则相反。

我大概讲解下建一个树形堆的算法过程:

找到N/2 位置的数组数据, 从这个位置开始, 找到该节点的左子结点的索引, 先比较这个结点的下的子结点, 找到最大的那个, 将最大的子结点的索引赋值给左子结点, 然后将最大的子结点和父结点进行对比, 如果比父结点大, 与父节点交换数据。当然, 我只是大概说了下实现, 在此过程中, 还需要考虑结点不存在的情况。

看下代码:

# 构建二叉堆 def binaryHeap(arr, lenth, m):  temp = arr[m] # 当前结点的值  while(2*m+1 < lenth):  lchild = 2*m+1  if lchild != lenth - 1 and arr[lchild] < arr[lchild + 1]:  lchild = lchild + 1  if temp < arr[lchild]:  arr[m] = arr[lchild]  else:  break  m = lchild  arr[m] = temp   def heapsort(arr, length):  i = int(len(arr)/2)  while(i >= 0):  binaryHeap(arr, len(arr), i)  i = i - 1   print("二叉堆的物理顺序为:")  print(arr) # 输出二叉堆的物理顺序   if __name__ == '__main__':  arr = [2, 87, 39, 49, 34, 62, 53, 6, 44, 98]   heapsort(arr, len(arr))

堆排序过程就是依次将最后的结点与首个节点进行对比交换:

# 构建二叉堆def binaryHeap(arr, lenth, m):  temp = arr[m] # 当前结点的值  while(2*m+1 < lenth):    lchild = 2*m+1    if lchild != lenth - 1 and arr[lchild] < arr[lchild + 1]:      lchild = lchild + 1    if temp < arr[lchild]:      arr[m] = arr[lchild]    else:      break    m = lchild  arr[m] = tempdef heapsort(arr, length):  i = int(len(arr)/2)  while(i >= 0):    binaryHeap(arr, len(arr), i)    i = i - 1  print("二叉堆的物理顺序为:")  print(arr) # 输出二叉堆的物理顺序  i = length-1  while(i > 0):    arr[i], arr[0] = arr[0], arr[i] # 变量交换    binaryHeap(arr, i, 0)    i = i - 1560def pop(arr):  first = arr.pop(0)  return firstif __name__ == '__main__':  arr = [2, 87, 39, 49, 34, 62, 53, 6, 44, 98]  heapsort(arr, len(arr))  print("堆排序后的物理顺序")  print(arr) # 输出经过堆排序之后的物理顺序  data = pop(arr)  print(data)  print(arr)

python封装了一个堆模块, 我们使用该模块可以很高效的实现一个优先队列

import heapqclass Item:  def __init__(self, name):    self.name = name  def __repr__(self):    return 'Item({!r})'.format(self.name)class PriorityQueue:  def __init__(self):    self._queue = []    self._index = 0  def push(self, item, priority):    heapq.heappush(self._queue, (-priority, self._index, item)) # 存入一个三元组    self._index += 1  def pop(self):    return heapq.heappop(self._queue)[-1] # 逆序输出if __name__ == '__main__':  p = PriorityQueue()  p.push(Item('foo'), 1)  p.push(Item('bar'), 5)  p.push(Item('spam'), 4)  p.push(Item('grok'), 1)  print(p.pop())  print(p.pop())

具体请看heapq官网

以上这篇python下实现二叉堆以及堆排序的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


  • 上一条:
    Python 基础教程之闭包的使用方法
    下一条:
    Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客