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 判断自定义对象类型
Mar 21 Python
Python快速排序算法实例分析
Nov 29 Python
python的re正则表达式实例代码
Jan 24 Python
python模拟表单提交登录图书馆
Apr 27 Python
Python RabbitMQ消息队列实现rpc
May 30 Python
Python3.5迭代器与生成器用法实例分析
Apr 30 Python
浅析python redis的连接及相关操作
Nov 07 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
May 26 Python
python 解决selenium 中的 .clear()方法失效问题
Sep 01 Python
Django项目创建及管理实现流程详解
Oct 13 Python
Python源码解析之List
May 21 Python
python函数的两种嵌套方法使用
Apr 02 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工厂模式的好处
2013/06/18 PHP
PHP fastcgi模式上传大文件(大约有300多K)报错
2014/09/28 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
PHP后门隐藏的一些技巧总结
2020/11/04 PHP
javascript据option的value值快速设定初始的selected选项
2007/08/13 Javascript
ImageZoom 图片放大镜效果(多功能扩展篇)
2010/04/14 Javascript
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
基于html5和nodejs相结合实现websocket即使通讯
2015/11/19 NodeJs
JS根据浏览器窗口大小实时动态改变网页文字大小的方法
2016/02/25 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
详解angular element()方法使用
2017/04/08 Javascript
JS一个简单的注册页面实例
2017/09/05 Javascript
vue基于mint-ui的城市选择3级联动的示例
2017/10/25 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
通过封装scroll.js 获取滚动条的值
2018/07/13 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
原生js实现日期选择插件
2020/05/21 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
Python中装饰器的一个妙用
2015/02/08 Python
python判断图片宽度和高度后删除图片的方法
2015/05/22 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
Python实现对象转换为xml的方法示例
2017/06/08 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
python 使用openpyxl读取excel数据
2021/02/18 Python
纯CSS3实现鼠标悬停提示气泡效果
2014/02/28 HTML / CSS
荷兰家电购物网站:Expert.nl
2020/01/18 全球购物
linux面试题参考答案(1)
2016/01/22 面试题
就业推荐表自我鉴定
2013/10/29 职场文书
销售内勤岗位职责
2014/04/15 职场文书
小学生期末评语大全
2014/04/21 职场文书
小学三年级学生评语
2014/04/22 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
python基于turtle绘制几何图形
2021/06/15 Python