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之模拟鼠标键盘动作具体实现
Dec 30 Python
使用 Python 获取 Linux 系统信息的代码
Jul 13 Python
Python实现将n个点均匀地分布在球面上的方法
Mar 12 Python
python删除过期log文件操作实例解析
Jan 31 Python
python数据归一化及三种方法详解
Aug 06 Python
tensorflow的ckpt及pb模型持久化方式及转化详解
Feb 12 Python
在PyCharm中实现添加快捷模块
Feb 12 Python
使用Pyhton 分析酒店针孔摄像头
Mar 04 Python
Python3基于plotly模块保存图片表格
Aug 03 Python
解决python和pycharm安装gmpy2 出现ERROR的问题
Aug 28 Python
Python学习之os包使用教程详解
Mar 21 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中header和session_start前不能有输出原因分析
2013/01/11 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
javascript对话框使用方法(警告框 javascript确认框 提示框)
2014/01/07 Javascript
JavaScript中的prototype.bind()方法介绍
2014/04/04 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
javascript函数声明和函数表达式区别分析
2014/12/02 Javascript
Javascript数组与字典用法分析
2014/12/13 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
js事件冒泡、事件捕获和阻止默认事件详解
2016/08/04 Javascript
jquery实现瀑布流效果 jquery下拉加载新数据
2016/12/12 Javascript
JS实现页面打印功能
2017/03/16 Javascript
JavaScript实现简单评论功能
2017/08/17 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
jQuery实现日历效果
2020/09/11 jQuery
[03:06]3分钟带你回顾DOTA2完美盛典&完美大师赛
2017/12/06 DOTA
urllib2自定义opener详解
2014/02/07 Python
编写简单的Python程序来判断文本的语种
2015/04/07 Python
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
以一个投票程序的实例来讲解Python的Django框架使用
2016/02/18 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
Python无损音乐搜索引擎实现代码
2018/02/02 Python
python3+PyQt5实现拖放功能
2018/04/24 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
实例详解Python装饰器与闭包
2019/07/29 Python
Python3 sys.argv[ ]用法详解
2019/10/24 Python
pygame实现俄罗斯方块游戏(AI篇1)
2019/10/29 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
Python importlib动态导入模块实现代码
2020/04/16 Python
django filter过滤器实现显示某个类型指定字段不同值方式
2020/07/16 Python
酒店行政人事部经理职务说明书
2014/02/26 职场文书
六五普法规划实施方案
2014/03/21 职场文书
高中课程设置方案
2014/05/28 职场文书
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
2021/04/27 Python
vue实现移动端div拖动效果
2022/03/03 Vue.js