什么是最小堆,最大堆最小堆算法
目录
0.什么是堆?
1.最大堆的实现
2.最小堆的实现
3.堆排序
0.什么是一堆小桩和大桩分为如下图:
堆需要满足的条件:
1.必须是二叉树,而且必须是完全二叉树
2.每个父节点必须大于或小于左右节点,并且顶部根节点必须是最大或最小的。
堆可以用链表来实现,即每个节点上的值按照序列遍历顺序存放在一个数组中。父节点和子节点之间存在以下关系:
从I 0开始
parent=(I-1)//2;left=2 * I 1;右=2 *(I ^ 1)
1.最大堆的实现堆以数组的形式表示,不使用指针。
2.向堆中添加元素
3.删除根节点并重建堆结构。
#实现最大堆类maxheap (): def _ _ init _ _ (self,Maxsize=none):self . Maxsize=Maxsize self . Li=[none]* Maxsize self . count=0 deflength(self):#查找数组长度返回self . count def show(self):if self . count=0:print( null )else:print(self . Li[:self . count])def add(self,Value):ifself . count=self . Maxsize:#判断数组是否越界。raise exception( full )self . Li[self . count]=value #将新节点添加到最后一个self。_shift_up(self.count) #构建递归堆self.count=1def _ shift _ up (self,index): #向堆中添加元素并确保根节点为最大值:#1。向最后一个节点添加新值,并在Add中实现;2.与父节点相比,如果值大于父节点,交换if index 0: parent=(index-1) //2 #查找根节点if self.li[index]self . Li[parent]:#交换节点Self . Li[index],Self。李[父母]=自己。李【父母】,自我。李[索引]自我。_ shift _ up (parent) #继续自下而上递归判断def extract(self):#弹出最大堆的根节点,即最大值#1。删除根节点,使最后一个节点成为更新的节点;2.判断根节点和左右节点的大小,如果不是自己。count:raise exception( null )value=self . Li[0]self . count-=1 self . Li[0]=self . Li[self . count]#将最后一个值更改为第一个self。_ shift _ down (0)返回值def _ shift _ down (self,index): # 1。确定是否有左子节点且左大于根且左大于右;2.判断是否有右子节点,右大于根left=2 * index 1 right=2 * index 2 large=index #判断条件#包含以下两个条件,判断左右节点较大的情况。如果是3,4,5,第一个判断条件使large=1,然后执行第二个条件,然后判断其左右节点的大小如果left self.length()和self . Li[left]self . Li[large]:large=left if right self . length()和self . Li[right]self . Li[large]:large=right if large!=index: #将两者交换为self.li [index],self.li [large]=self.li [large],self.li[index] self。_shift_down(最大)m=max heap(10)import numpy as NP NP NP . random . seed(123)num=NP . random . randint(100,Size=10) #为num中的I创建一个随机的10位数打印(m . length())m . add(I)m . show()print(m . length())为范围中的I(5):print(m . extract(),end=,)
2.最小堆的实现#构造最小堆class min heap():def _ _ init _ _(self,maxSize=None):self。maxSize=maxSize self。array=[None]* maxSize self ._count=0定义长度(自身):返回自我._计数定义显示(自身):如果自我._ count=0:print( null )print(self。数组[:self ._count],end=,)def add(self,value): #增加元素如果自我. count=self.maxSize:引发异常("数组已满”)self.array[self ._count]=值本身. shift_up(self ._count)自己. count=1 def _shift_up(自身,索引):#比较结点与根节点的大小,较小的为根结点if index 0:parent=(index-1)//2 if self . array[parent]self。数组[索引]:self。数组[父级],自身。数组[索引]=自身。数组[索引],self。数组[父级]自身._shift_up(父)定义提取(自身):#获取最小值,并更新数组如果自我. count=0:引发异常("数组为空”)value=self.array[0] self ._count -=1 #更新数组的长度self.array[0]=self.array[self ._count] #将最后一个结点放在前面自我. shift_down(0)返回值def _shift_down自身,索引):#此时指数是根结点如果索引自我. count:左=2 *索引一右=2 *索引2 #判断左右结点是否越界,是否小于根结点,如果是这交换如果离开自我。_计数和正确的自我. count和self。数组[左]自我。数组[索引]和自身。数组[左]自我。数组[右]:self。数组[索引],self。数组[左]=自身。数组[左],self . array[索引] #交换得到较小的值自我. shift_down(左)elif离开自我._计数和正确的自我. count _ and self . array[右] self。数组[左]和self。数组[右]自我。数组[索引]:self。阵[右],自。数组[索引]=自身。数组[索引],self。阵列[右]自身._shift_down(右)#特殊情况:如果只有做叶子结点如果离开自我。_计数和正确的自我. count _ and self . array[left]self。数组[索引]:self。数组[左],self。数组[索引]=自身。数组[索引],self。数组[左]self ._ shift _ down(left)mi=min heap(10)print()print(-小顶堆-)为我在num:mi。添加(I)mi。显示()打印(mi。length())for _ in范围(len(num)):print(mi。extract(),end=,)print()print(mi.length())参考:https://博客。csdn。net/QQ _ 23869697/文章/详情/82735088
https://python数据结构和算法。阅读文档。io/zh/最新/15 _堆与堆排序/heap_and_heapsort/#_4
3.堆排序def maxHeapfy(list,length,parent):left=2 * parent 1 right=2 * parent 2 maximum=parent if left length and list[left]list[maximum]:maximum=left if right length and list[right]list[maximum]:maximum=right if maximum!=父母:列表[最大],列表[父]=列表[父],列表[最大] maxHeapfy(列表,长度,最大)#递归构建def buildMaxHeap(列表):#构建最大堆n=len(a list)last parent=(n-1)//2 for I in range(last parent,-1,-1): maxHeapfy(alist,n,I)def heap sort(a list):build max heap(a list)n=len(a list)for I in range(n-1,-1,-1): alist[0],alist[i]=alist[i],alist[0] #将最大值放在最后面maxHeapfy(alist,I,0) return alista=[30,50,57,77,62,78,94,80,84]print(a)print(堆排序(a))alist=[2,4,1,2,5,58,45,24,67]print(堆排序(alist))b=[random。randint(1,1000)for I in range(1000)]print(b)print(堆排序(b))
项目推荐:
2000多G的计算机各行业电子资源分享(持续更新)
2020年微信小程序全栈项目之喵喵交友【附课件和源码】
Spring Boot开发小而美的个人博客【附课件和源码】
Java微服务实战296集大型视频-谷粒商城【附代码和课件】
Java开发微服务畅购商城实战【全357集大项目】-附代码和课件
最全最详细数据结构与算法视频-【附课件和源码】
历史中提交的图片或压缩文件