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 相关文章推荐
利用soaplib搭建webservice详细步骤和实例代码
Nov 20 Python
使用Python制作微信跳一跳辅助
Jan 31 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
python selenium firefox使用详解
Feb 26 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
python安装pil库方法及代码
Jun 25 Python
python画双y轴图像的示例代码
Jul 07 Python
Django的models模型的具体使用
Jul 15 Python
django搭建项目配置环境和创建表过程详解
Jul 22 Python
python读取yaml文件后修改写入本地实例
Apr 27 Python
keras打印loss对权重的导数方式
Jun 10 Python
大数据分析用java还是Python
Jul 06 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
轻松入门: 煮好咖啡的七个诀窍
2021/03/03 冲泡冲煮
php实现图片等比例缩放代码
2015/07/23 PHP
基于JQuery的数字改变的动画效果--可用来做计数器
2010/08/11 Javascript
javascript截取字符串(通过substring实现并支持中英文混合)
2013/06/24 Javascript
用JS做的简单的可折叠的两级树形菜单
2013/09/21 Javascript
javascript unicode与GBK2312(中文)编码转换方法
2013/11/14 Javascript
js创建表单元素并使用submit进行提交
2014/08/14 Javascript
Node.js中的事件驱动编程详解
2014/08/16 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
分享两款带遮罩的jQuery弹出框
2015/12/30 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
2016/06/12 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
快速入门Vue
2016/12/19 Javascript
完美解决手机浏览器顶部下拉出现网页源或刷新的问题
2017/11/30 Javascript
javascript中数组的常用算法深入分析
2019/03/12 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
Python类定义和类继承详解
2015/05/08 Python
pygame播放音乐的方法
2015/05/19 Python
最近Python有点火? 给你7个学习它的理由!
2017/06/26 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
Tornado 多进程实现分析详解
2018/01/12 Python
对numpy中布尔型数组的处理方法详解
2018/04/17 Python
解决已经安装requests,却依然提示No module named requests问题
2018/05/18 Python
python中单下划线_的常见用法总结
2018/07/10 Python
python pygame模块编写飞机大战
2018/11/20 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
Django中Middleware中的函数详解
2019/07/18 Python
使用python模拟命令行终端的示例
2019/08/13 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
绩效管理实施方案
2014/03/19 职场文书
师德师风自查材料
2014/10/14 职场文书
培训督导岗位职责
2015/04/10 职场文书
反腐倡廉观后感
2015/06/08 职场文书