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中变量的作用域
Jun 16 Python
Python中的os.path路径模块中的操作方法总结
Jul 07 Python
Django数据库操作的实例(增删改查)
Sep 04 Python
使用DataFrame删除行和列的实例讲解
Apr 08 Python
Python简单计算文件MD5值的方法示例
Apr 11 Python
Python之读取TXT文件的方法小结
Apr 27 Python
python 接收处理外带的参数方法
Dec 03 Python
Django forms表单 select下拉框的传值实例
Jul 19 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
Aug 22 Python
python3文件复制、延迟文件复制任务的实现方法
Sep 02 Python
windows 10 设定计划任务自动执行 python 脚本的方法
Sep 11 Python
详解python中的异常和文件读写
Jan 03 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 批量删除 sql语句
2009/06/05 PHP
php实现复制移动文件的方法
2015/07/29 PHP
php抓取网站图片并保存的实现方法
2015/10/29 PHP
laravel 配置路由 api和web定义的路由的区别详解
2019/09/03 PHP
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
JS:window.onload的使用介绍
2013/11/13 Javascript
jquery1.10给新增元素绑定事件的方法
2014/03/06 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
JS实现图片产生波纹一样flash效果的方法
2015/02/27 Javascript
nodejs中的fiber(纤程)库详解
2015/03/24 NodeJs
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
vue 左滑删除功能的示例代码
2019/01/28 Javascript
vue实现记事本功能
2019/06/26 Javascript
layui表格数据重载
2019/07/27 Javascript
[01:46]DOTA2上海特锦赛小组赛英文解说KotlGuy采访
2016/02/27 DOTA
itchat和matplotlib的结合使用爬取微信信息的实例
2017/08/25 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
Django学习笔记之为Model添加Action
2019/04/30 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
Python内置函数property()如何使用
2020/09/01 Python
怎么解决pycharm license Acti的方法
2020/10/28 Python
韩国著名的在线综合购物网站:Akmall
2016/08/07 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
专业求职信撰写要诀
2014/02/18 职场文书
教师师德演讲稿
2014/05/06 职场文书
工会工作先进事迹
2014/08/18 职场文书
护理专业自我评价
2015/03/11 职场文书
2015年大班保育员工作总结
2015/05/18 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
实习单位意见
2015/06/04 职场文书
消费者投诉书范文
2015/07/02 职场文书