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 datetime时间格式化去掉前导0
Jul 31 Python
python sort、sorted高级排序技巧
Nov 21 Python
python 实现网上商城,转账,存取款等功能的信用卡系统
Jul 15 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
python全栈要学什么 python全栈学习路线
Jun 28 Python
python numpy中cumsum的用法详解
Oct 17 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
May 26 Python
python实点云分割k-means(sklearn)详解
May 28 Python
解决Python paramiko 模块远程执行ssh 命令 nohup 不生效的问题
Jul 14 Python
Django基于Models定制Admin后台实现过程解析
Nov 11 Python
详解用 python-docx 创建浮动图片
Jan 24 Python
详解Python调用系统命令的六种方法
Jan 28 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 遍历XP文件夹下所有文件
2008/11/27 PHP
PHP 字符串 小常识
2009/06/05 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
一波JavaScript日期判断脚本分享
2016/03/06 Javascript
JavaScript中的事件委托及好处
2016/07/12 Javascript
Angular2 (RC4) 路由与导航详解
2016/09/21 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
vue click.stop阻止点击事件继续传播的方法
2018/09/04 Javascript
vue的全局变量和全局拦截请求器的示例代码
2018/09/13 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
基于javascript实现放大镜特效
2020/12/03 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
用Python实现web端用户登录和注册功能的教程
2015/04/30 Python
python使用生成器实现可迭代对象
2018/03/20 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
python 实现生成均匀分布的点
2019/12/05 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
python与js主要区别点总结
2020/09/13 Python
python中用ctypes模拟点击的实例讲解
2020/11/26 Python
Django模板报TemplateDoesNotExist异常(亲测可行)
2020/12/18 Python
Alexandre Birman美国官网:亚历山大·伯曼
2019/10/30 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
幼儿园家长评语
2014/02/10 职场文书
十八届三中全会个人学习材料
2014/02/13 职场文书
文明寄语大全
2014/04/11 职场文书
物资采购方案
2014/06/12 职场文书
2014年银行客户经理工作总结
2014/11/12 职场文书
2014年医德医风工作总结
2014/11/13 职场文书
行政前台岗位职责
2015/04/16 职场文书