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爬虫之抓取糗事百科代码分享
Nov 06 Python
Python操作CouchDB数据库简单示例
Mar 10 Python
Python生成器以及应用实例解析
Feb 08 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
python os.fork() 循环输出方法
Aug 08 Python
python多进程间通信代码实例
Sep 30 Python
python连接mongodb集群方法详解
Feb 13 Python
基于matplotlib xticks用法详解
Apr 16 Python
python中取绝对值简单方法总结
Jul 24 Python
Python如何截图保存的三种方法(小结)
Sep 01 Python
7个关于Python的经典基础案例
Nov 07 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
一些操作和快捷键的理解和讨论
2020/03/04 星际争霸
PHP遍历二维数组的代码
2011/04/22 PHP
PHP正则表达式之定界符和原子介绍
2012/10/05 PHP
php封装的单文件(图片)上传类完整实例
2016/10/18 PHP
实例讲解通过​PHP创建数据库
2019/01/20 PHP
js限制文本框只能输入中文的方法
2015/08/11 Javascript
javascript中tostring()和valueof()的用法及两者的区别
2015/11/16 Javascript
浅析JavaScript中break、continue和return的区别
2016/11/30 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
echarts饼图扇区添加点击事件的实例
2017/10/16 Javascript
JS实现可针对算术表达式求值的计算器功能示例
2018/09/04 Javascript
vuejs简单验证码功能完整示例
2019/01/08 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
Vue 动态添加路由及生成菜单的方法示例
2019/06/20 Javascript
微信小程序实现横向滚动导航栏效果
2019/12/12 Javascript
JavaScript Array.flat()函数用法解析
2020/09/02 Javascript
v-slot和slot、slot-scope之间相互替换实例
2020/09/04 Javascript
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python实现全局变量的两个解决方法
2014/07/03 Python
Python爬取腾讯视频评论的思路详解
2019/12/19 Python
使用pytorch实现可视化中间层的结果
2019/12/30 Python
Python图像处理库PIL的ImageGrab模块介绍详解
2020/02/26 Python
python字典的值可以修改吗
2020/06/29 Python
Python使用urlretrieve实现直接远程下载图片的示例代码
2020/08/17 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
PatPat阿根廷:妈妈们的购物平台
2019/05/30 全球购物
如何写一份好的自荐信
2014/01/02 职场文书
同学聚会欢迎辞
2014/01/14 职场文书
班级入场式解说词
2014/02/01 职场文书
银行求职自荐信
2014/06/30 职场文书
社区工作者个人总结
2015/02/28 职场文书
优秀大学生申请书
2019/06/24 职场文书
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python
使用Oracle命令进行数据库备份与还原
2021/12/06 Oracle
HTML中link标签属性的具体用法
2023/05/07 HTML / CSS