网络编程
位置:首页>> 网络编程>> Python编程>> python下实现二叉堆以及堆排序的示例

python下实现二叉堆以及堆排序的示例

作者:又见阿郎  发布时间:2023-02-19 16:44:23 

标签:堆排序,python,二叉堆

堆是一种特殊的树形结构, 堆中的数据存储满足一定的堆序。堆排序是一种选择排序, 其算法复杂度, 时间复杂度相对于其他的排序算法都有很大的优势。

堆分为大头堆和小头堆, 正如其名, 大头堆的第一个元素是最大的, 每个有子结点的父结点, 其数据值都比其子结点的值要大。小头堆则相反。

我大概讲解下建一个树形堆的算法过程:

找到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官网

来源:http://www.cnblogs.com/zhiyong-ITNote/archive/2017/09/28/7608330.html

0
投稿

猜你喜欢

  • 我就废话不多说了,大家还是直接看代码吧~'''Created on 2018-4-16'''
  • 目录前言为什么要用numpy数组的创建生成均匀分布的array:生成特殊数组获取数组的属性数组索引,切片,赋值数组操作输出数组总结前言Num
  • 本文实例讲述了php文件缓存类用法。分享给大家供大家参考。具体如下:<?php/** * 简单的文件缓存类 * */class XZC
  • 为满足用户的视觉追求及产品的背景图片的换肤功能,设计师难免在设计上会用到半透明的效果。因此页面重构师基于视觉及产品的需要,采用了PNG32的
  • Oracle客户端精简后的文件,可以实现数据库的通信,直接和软件打包: 第一步:拷贝文件:主要是四个目录:bin,nls,oracore,N
  • 利用numpy库(缺点:有缺失值就无法读取)读:import numpy my_matrix = numpy.loadtxt(open(&q
  • 代码代码很简单,主要是为了熟悉Selenium这个库的函数,为后续的短信轰炸做个铺垫from selenium import webdriv
  • 本文实例讲述了python通过索引遍历列表的方法。分享给大家供大家参考。具体如下:python中我们可以通过for循环来遍历列表:colou
  • 前言:创建进程池可以形象地理解为创建一个并行的流水线,只需创建一次流水线的消耗,处理接收到的任务的,不使用进程池。 ,浪费时间。中方本来没有
  • 随着十几年前“用户体验”这一概念的提出,“用户研究”也逐渐发展成为一个新兴的行业。那么,“用户研究”究竟包括哪些工作内容,在企业中如何开展,
  • 本文实例讲述了Python实现的求解最小公倍数算法。分享给大家供大家参考,具体如下:简单分析了一下,前面介绍的最大公约数的求解方法跟最小公倍
  • 一位资深的设计师曾经向我抱怨,说老板不仅让他做“设计”工作,还让他做“制作”工作,真是很烦。言下之意,“制作”还要一个资深设计师亲自上阵,未
  • 有时候需要罗列下U盘等移动设备或一个程序下面的目录结构的需求。基于这样的需求个人整理了一个使用Python的小工具,期望对有这方面需求的朋友
  • 本文介绍了用ASP的AdoDb.Stream读取/写入UTF-8编码格式的文件的方法:函数名称:ReadTextFile 作用:利用AdoD
  • 本文介绍了linux下如何备份与恢复mysql数据库。数据库备份是非常重要的。如果定期做好备份,这样就可以在发生系统崩溃时恢复数据到最后一次
  • python中字典和列表的使用,在数据处理中应该是最常用的,这两个熟练后基本可以应付大部分场景了。不过网上的基础教程只告诉你列表、字典是什么
  • HMAC 算法可用于验证在应用程序之间传递或存储在潜在易受攻击位置的信息的完整性。基本思想是生成与共享密钥组合的实际数据的加密散列。然后,可
  • 前些日子在SmashingMagazine看到一篇关于CSS3新技术不错的文章,它详细介绍了CSS3的新特性和它的使用方法,它包括:浏览器专
  • Windows 10家庭中文版,Python 3.6.4,stomp.py 4.1.21ActiveMQ支持Python访问,提供了基于ST
  • 目录过程拍照用到的Python 操作库Python遍历文件夹获取图片旋转图片展示方向并压缩像素整体代码整体代码将脚本打包成exe安装&nbs
手机版 网络编程 asp之家 www.aspxhome.com