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系列之从文件读取和保存数据
May 23 Python
Python实现的二维码生成小软件
Jul 11 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
Python中实现变量赋值传递时的引用和拷贝方法
Apr 29 Python
python实现爬取图书封面
Jul 05 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
python3使用QQ邮箱发送邮件
May 20 Python
python自动发微信监控报警
Sep 06 Python
Django ORM 查询表中某列字段值的方法
Apr 30 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
keras:model.compile损失函数的用法
Jul 01 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
Nov 01 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调用三种数据库的方法(3)
2006/10/09 PHP
php输出1000以内质数(素数)示例
2014/02/16 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
THINKPHP5.1 Config的配置与获取详解
2020/06/08 PHP
javascript 鼠标拖动图标技术
2010/02/07 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
动态加载脚本提升javascript性能
2014/02/24 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
javascript 构造函数方式定义对象
2015/01/02 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
jQuery实现带右侧索引功能的通讯录示例【附源码下载】
2018/04/17 jQuery
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
js 压缩图片的示例(只缩小体积,不更改图片尺寸)
2020/10/21 Javascript
python实现的防DDoS脚本
2011/02/08 Python
Python学习笔记(一)(基础入门之环境搭建)
2014/06/05 Python
PyCharm 设置SciView工具窗口的方法
2019/01/15 Python
Python Sphinx使用实例及问题解决
2020/01/17 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
Python基于gevent实现高并发代码实例
2020/05/15 Python
使用css3绘制出各种几何图形
2016/08/17 HTML / CSS
新加坡网上美容店:Hermo新加坡
2019/06/19 全球购物
董事长助理工作职责
2014/06/08 职场文书
三关爱志愿服务活动方案
2014/08/17 职场文书
学校个人对照检查材料
2014/08/26 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
在职证明范本
2015/06/15 职场文书
《社戏》教学反思
2016/02/22 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
mysql知识点整理
2021/04/05 MySQL
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python
MySQL 中如何归档数据的实现方法
2022/03/16 SQL Server