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中使用pprint函数进行格式化输出的教程
Apr 07 Python
Python基于PycURL实现POST的方法
Jul 25 Python
Python3实现并发检验代理池地址的方法
Sep 18 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
详解如何利用Cython为Python代码加速
Jan 27 Python
PyQt实现界面翻转切换效果
Apr 20 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
Python Series从0开始索引的方法
Nov 06 Python
Python安装OpenCV的示例代码
Mar 05 Python
Python3开发环境搭建详细教程
Jun 18 Python
pytorch学习教程之自定义数据集
Nov 10 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代码把全角数字转为半角数字
2007/12/10 PHP
php环境配置之CGI、FastCGI、PHP-CGI、PHP-FPM、Spawn-FCGI比较?
2011/10/17 PHP
php生成图片验证码的方法
2016/04/15 PHP
PHP基于自增数据如何生成不重复的随机数示例
2017/05/19 PHP
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
jQuery Trim去除字符串首尾空字符的实现方法说明
2014/02/11 Javascript
使用GruntJS构建Web程序之Tasks(任务)篇
2014/06/06 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
js实现从数组里随机获取元素
2015/01/12 Javascript
浅谈被jQuery抛弃的函数及替代函数
2015/05/03 Javascript
js实现新年倒计时效果
2015/12/10 Javascript
JavaScript、jQuery与Ajax的关系
2016/01/24 Javascript
JavaScript事件处理的方式(三种)
2016/04/26 Javascript
第十篇BootStrap轮播插件使用详解
2016/06/21 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
基于vue实现分页/翻页组件paginator示例
2017/03/09 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
JavaScript之Date_动力节点Java学院整理
2017/06/28 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
vue2.0 自定义组件的方法(vue组件的封装)
2018/06/05 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
从零学Python之入门(二)基本数据类型
2014/05/25 Python
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
python 打印出所有的对象/模块的属性(实例代码)
2016/09/11 Python
解决python 输出是省略号的问题
2018/04/19 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Python 一句话生成字母表的方法
2019/01/02 Python
解决PyCharm无法使用lxml库的问题(图解)
2020/12/22 Python
HTML5页面音视频在微信和app下自动播放的实现方法
2016/10/20 HTML / CSS
澳大利亚相机之家:Camera House
2017/11/30 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
中学生个人自我评价
2014/02/06 职场文书
敬老院活动感想
2015/08/07 职场文书