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实现博客文章爬虫示例
Feb 26 Python
使用Python抓取模板之家的CSS模板
Mar 16 Python
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
May 18 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
Feb 24 Python
Django项目中model的数据处理以及页面交互方法
May 30 Python
妙用itchat! python实现久坐提醒功能
Nov 25 Python
Python绘制二维曲线的日常应用详解
Dec 04 Python
关于TensorFlow新旧版本函数接口变化详解
Feb 10 Python
Python3+selenium实现cookie免密登录的示例代码
Mar 18 Python
Python基于Hypothesis测试库生成测试数据
Apr 29 Python
Python破解极验滑动验证码详细步骤
May 21 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 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设计模式 Bridge (桥接模式)
2011/06/26 PHP
php中将图片gif,jpg或mysql longblob或blob字段值转换成16进制字符串
2011/08/23 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
PHP设计模式之观察者模式(Observer)详细介绍和代码实例
2014/04/08 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
微信公众平台实现获取用户OpenID的方法
2015/04/15 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
Firefox outerHTML实现代码
2009/06/04 Javascript
jQuery实现表单步骤流程导航代码分享
2015/08/28 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
使用vue的transition完成滑动过渡的示例代码
2018/06/25 Javascript
[16:19]教你分分钟做大人——风暴之灵
2015/03/11 DOTA
零基础学Python(一)Python环境安装
2014/08/20 Python
python executemany的使用及注意事项
2017/03/13 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
opencv实现图片模糊和锐化操作
2018/11/19 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
python查看数据类型的方法
2019/10/12 Python
解决Python pip 自动更新升级失败的问题
2020/02/21 Python
python图片指定区域替换img.paste函数的使用
2020/04/09 Python
如何利用Python识别图片中的文字
2020/05/31 Python
Python常用断言函数实例汇总
2020/11/30 Python
HTML5 创建canvas元素示例代码
2014/06/04 HTML / CSS
北美个性化礼品商店:Things Remembered
2018/06/12 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
幼儿园大班毕业感言
2014/02/06 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
初中学校军训方案
2014/05/09 职场文书
小学生常见病防治方案
2014/06/06 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
小学校长个人总结
2015/03/03 职场文书
培训通知书模板
2015/04/17 职场文书
python 破解加密zip文件的密码
2021/04/22 Python
pytorch 如何使用float64训练
2021/05/24 Python