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中的并发编程实例
Jul 07 Python
Python判断字符串与大小写转换
Jun 08 Python
Python对数据库操作
Mar 28 Python
Python探索之实现一个简单的HTTP服务器
Oct 28 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
python编写暴力破解zip文档程序的实例讲解
Apr 24 Python
python3处理含有中文的url方法
May 10 Python
详解Python连接MySQL数据库的多种方式
Apr 16 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
python 实现 hive中类似 lateral view explode的功能示例
May 18 Python
Pytest测试框架基本使用方法详解
Nov 25 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 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
《雄兵连》《烈阳天道》真的来了
2020/07/13 国漫
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
非常不错的一个javascript 类
2006/11/07 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
input标签内容改变的触发事件介绍
2014/06/18 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
jQuery实现的仿select功能代码
2015/08/19 Javascript
常用jQuery选择器汇总
2017/02/02 Javascript
jquery实现下拉菜单的手风琴效果
2017/07/23 jQuery
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
vue中的ref和$refs的使用
2018/11/22 Javascript
jQuery选择器之基本选择器用法实例分析
2019/02/19 jQuery
JS中FormData类实现文件上传
2020/03/27 Javascript
Django日志模块logging的配置详解
2017/02/14 Python
关于Python中空格字符串处理的技巧总结
2017/08/10 Python
Python实现多线程的两种方式分析
2018/08/29 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
python中下标和切片的使用方法解析
2019/08/27 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
基于selenium及python实现下拉选项定位select
2020/07/22 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
Vince官网:全球著名设计师品牌,休闲而优雅的服饰
2017/01/15 全球购物
如何判断一段程序是由C 编译程序还是由C++编译程序编译的
2013/08/04 面试题
Laravel中Kafka的使用详解
2021/03/24 PHP
早读迟到检讨书
2014/01/24 职场文书
年会搞笑主持词
2014/03/27 职场文书
爱护草坪标语
2014/06/24 职场文书
中学生运动会新闻稿
2014/09/24 职场文书
重阳节活动主持词
2015/07/04 职场文书
保险公司增员口号
2015/12/25 职场文书
七年级上册生物的课件
2019/08/07 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB