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比较两个图片相似度的方法
Mar 13 Python
Python Sqlite3以字典形式返回查询结果的实现方法
Oct 03 Python
恢复百度云盘本地误删的文件脚本(简单方法)
Oct 21 Python
python实现二维插值的三维显示
Dec 17 Python
在Python中使用Neo4j的方法
Mar 14 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
python2.7的flask框架之引用js&amp;css等静态文件的实现方法
Aug 22 Python
python mqtt 客户端的实现代码实例
Sep 25 Python
Python中join()函数多种操作代码实例
Jan 13 Python
Python flask框架实现浏览器点击自定义跳转页面
Jun 04 Python
用Python开发app后端有优势吗
Jun 29 Python
python 实现控制鼠标键盘
Nov 27 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
德劲1103二次变频版的打磨
2021/03/02 无线电
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
php中mysql模块部分功能的简单封装
2011/09/30 PHP
PHP错误WARNING: SESSION_START() [FUNCTION.SESSION-START]解决方法
2014/05/04 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
用JAVASCRIPT如何给&amp;lt;textarea&amp;gt;&amp;lt;/textarea&amp;gt;赋值
2007/04/20 Javascript
this和执行上下文实现代码
2010/07/01 Javascript
javascript代码加载优化方法
2011/01/30 Javascript
js面向对象设计用{}好还是function(){}好(构造函数)
2011/10/23 Javascript
JavaScript实现的使用键盘控制人物走动实例
2014/08/27 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
2016/07/11 Javascript
Vue+axios实现统一接口管理的方法
2018/07/23 Javascript
Vue 框架之动态绑定 css 样式实例分析
2018/11/14 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
vue子组件改变父组件传递的prop值通过sync实现数据双向绑定(DEMO)
2020/02/01 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
Python使用设计模式中的责任链模式与迭代器模式的示例
2016/03/02 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
2017/04/18 Python
详解python实现数据归一化处理的方式:(0,1)标准化
2019/07/17 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
移动端rem布局的两种实现方法
2018/01/03 HTML / CSS
html5 标签
2009/07/16 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
药学专业大学生自荐信
2013/09/28 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
工程部岗位职责范本
2015/04/11 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
2019行政前台转正申请书范文3篇
2019/08/15 职场文书
导游词之青岛崂山
2019/12/27 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript
MySQL如何解决幻读问题
2021/08/07 MySQL