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


Posted in Python onSeptember 29, 2017

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

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

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

找到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] = temp


def 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 - 1560


def pop(arr):
  first = arr.pop(0)
  return first


if __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 heapq


class 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 Sql数据库增删改查操作简单封装
Apr 18 Python
Python中正则表达式详解
May 17 Python
Python3.6日志Logging模块简单用法示例
Jun 14 Python
python实现停车管理系统
Nov 30 Python
在Pandas中处理NaN值的方法
Jun 25 Python
解决Pytorch 加载训练好的模型 遇到的error问题
Jan 10 Python
python判断正负数方式
Jun 03 Python
keras CNN卷积核可视化,热度图教程
Jun 22 Python
Python+logging输出到屏幕将log日志写入文件
Nov 11 Python
python“静态”变量、实例变量与本地变量的声明示例
Nov 13 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
Sep 28 #Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 #Python
Python有序字典简单实现方法示例
Sep 28 #Python
python操作MySQL 模拟简单银行转账操作
Sep 27 #Python
python利用urllib和urllib2访问http的GET/POST详解
Sep 27 #Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 #Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 #Python
You might like
解析php中array_merge与array+array的区别
2013/06/21 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
js和as的稳定传值问题解决
2013/07/14 Javascript
Extjs实现进度条的两种便捷方式
2013/09/26 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
AngularJs  unit-testing(单元测试)详解
2016/09/02 Javascript
利用JS屏蔽页面中的Enter按键提交表单的方法
2016/11/25 Javascript
手把手教你把nodejs部署到linux上跑出hello world
2017/06/19 NodeJs
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
vue组件中使用iframe元素的示例代码
2017/12/13 Javascript
Vue中CSS动画原理的实现
2019/02/13 Javascript
ES10 特性的完整指南小结
2019/03/04 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
JS自定义滚动条效果
2020/03/13 Javascript
小程序自定义圆形进度条
2020/11/17 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
python多线程threading.Lock锁用法实例
2014/11/01 Python
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
python友情链接检查方法
2015/07/08 Python
NumPy排序的实现
2020/01/21 Python
python合并多个excel文件的示例
2020/09/23 Python
pymongo insert_many 批量插入的实例
2020/12/05 Python
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
中学教师实习自我鉴定
2013/09/28 职场文书
高一自我鉴定
2013/12/17 职场文书
高中生自我评语大全
2014/01/19 职场文书
保护环境的标语
2014/06/09 职场文书
离婚答辩状范文
2015/05/22 职场文书
2015团员个人年度总结
2015/11/24 职场文书
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers