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实现快速排序和插入排序算法及自定义排序的示例
Feb 16 Python
python用reduce和map把字符串转为数字的方法
Dec 19 Python
Python urls.py的三种配置写法实例详解
Apr 28 Python
TensorFlow实现Batch Normalization
Mar 08 Python
使用pandas读取csv文件的指定列方法
Apr 21 Python
python 对多个csv文件分别进行处理的方法
Jan 07 Python
Python 调用PIL库失败的解决方法
Jan 08 Python
python itchat给指定联系人发消息的方法
Jun 11 Python
python二维码操作:对QRCode和MyQR入门详解
Jun 24 Python
python实现输入的数据在地图上生成热力图效果
Dec 06 Python
使用Python构造hive insert语句说明
Jun 06 Python
python实现简单猜单词游戏
Dec 24 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
php5中类的学习
2008/03/28 PHP
php实现的短网址算法分享
2014/06/20 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
php遍历目录下文件并按修改时间排序操作示例
2019/07/12 PHP
asp.net和asp下ACCESS的参数化查询
2008/06/11 Javascript
Javascript Math对象
2009/08/13 Javascript
js实现文字滚动效果
2016/03/03 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
浅谈JavaScript中的this指针和引用知识
2016/08/05 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
2018/11/26 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
2020/07/11 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
2020/07/24 Javascript
[01:13:01]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第三场
2018/04/05 DOTA
python写的ARP攻击代码实例
2014/06/04 Python
Python max内置函数详细介绍
2016/11/17 Python
深入理解python中的select模块
2017/04/23 Python
Python爬虫实现爬取京东手机页面的图片(实例代码)
2017/11/30 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
python 使用poster模块进行http方式的文件传输到服务器的方法
2019/01/15 Python
Python中如何导入类示例详解
2019/04/17 Python
pycharm通过ssh连接远程服务器教程
2020/02/12 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
Html5页面点击遮罩层背景关闭遮罩层
2020/11/30 HTML / CSS
Nip + Fab官网:英国美容品牌
2019/08/26 全球购物
产品陈列协议书(标准版)
2014/09/17 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
阿凡达观后感
2015/06/10 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
vue实现无缝轮播效果(跑马灯)
2021/05/14 Vue.js
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫