Java数据结构之最小堆和最大堆怎么实现


这篇文章主要介绍“Java数据结构之最小堆和最大堆怎么实现”,在日常操作中,相信很多人在Java数据结构之最小堆和最大堆怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构之最小堆和最大堆怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!堆的历史堆的数据结构有很多种体现形式,包括;2-3堆、B堆、斐波那契堆,而在 Java API 中最常用的是用于实现优先队列的二叉堆,它是由 JWJ Williams 在 1964 年引入的,作为堆排序算法的数据结构。另外在 Dijkstra 算法等几种高效的图算法中,堆也是非常重要的。在计算机科学中免费云主机域名,堆(heap)的实现是一种基于树的特殊的数据结构,它可以在数组上构建出树的结构体,并满足堆的属性;最小堆:如果P是C的一个父级节点, 那么P的key(或value)应小于或等于C的对应值。最大堆:与最小堆的定义正好相反,最大堆(max heap) ,P的key(或value)大于C的对应值。堆的实现在 Java API 中主要体现在延迟队列的实现二叉堆上,这里小傅哥单独把这部分代码拆分出来,了解下关于小堆和大堆的实现。从对堆的数据结构介绍上可以看到,小堆和大堆的唯一区别仅是对元素的排序方式不同。所以也就是说在存放和获取元素的时候对元素的填充和摘除时,排序方式不同而已。堆的在存放元素时,以遵循它的特点,会在存放过程中,通过队尾元素向上比对迁移。入堆的实现 add 方法最终会调用到 siftUpComparable 方法,进行排序的方式进行处理。而这个排序 compareTo 方法是由具体的 MinHeap、MaxHeap 来做实现。以入堆元素2举例,如图所示入堆过程。首先将元素2挂到队列尾部,之后通过 (k – 1) >>> 1 计算父节点位置,与对应元素进行比对和判断交换。交换过程包括 2->6、2->5,以此交换结束后元素保存完毕。元素的出堆其实很简单,只要把根元素直接删除弹出即可。但剩余接下里的步骤才是复杂的,因为需要在根元素迁移走后,寻找另外的最小元素迁移到对头。这个过程与入堆正好相反,这是一个不断向下迁移的过程。不断地向下迁移元素。这个过程会比对左右子节点的值,找到最小的。所以整个过程会比入堆麻烦一些。这里以弹出元素1举例,之后将堆尾元素替换到相应的位置。整个过程分为6张图表述。图1到图2,找出根元素弹出。图3到图4,将根元素向下迁移,与子元素比对,并替换位置。如果这个位置与8相比,小于8则继续向下迁移。图4到图5,继续迁移,在原节点4的位置对应的两个子元素,都比8大,这个时候就可以停下来了。图5到图6,更换元素位置,把队尾的元素替换到对应元素1向下迁移检测的位置。小堆是一个正序比对测试结果17:21:30.053 [main] INFO queue.PriorityQueue – 【入队】元素:3 当前队列:[1,null,null,null,null,null,null,null,null,null,null]
17:21:30.055 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:1 parent:0
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:1 目标节点:3
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:1 Val:3
当前队列:[1,3,null,null,null,null,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】元素:5 当前队列:[1,3,null,null,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:2 parent:0
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:1 目标节点:5
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:2 Val:5
当前队列:[1,3,5,null,null,null,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】元素:11 当前队列:[1,3,5,null,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:3 parent:1
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:3 目标节点:11
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:3 Val:11
当前队列:[1,3,5,11,null,null,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】元素:4 当前队列:[1,3,5,11,null,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:4 parent:1
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:3 目标节点:4
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:4 Val:4
当前队列:[1,3,5,11,4,null,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】元素:6 当前队列:[1,3,5,11,4,null,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:5 parent:2
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:5 目标节点:6
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:5 Val:6
当前队列:[1,3,5,11,4,6,null,null,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】元素:7 当前队列:[1,3,5,11,4,6,null,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:6 parent:2
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:5 目标节点:7
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:6 Val:7
当前队列:[1,3,5,11,4,6,7,null,null,null,null]17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】元素:12 当前队列:[1,3,5,11,4,6,7,null,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:7 parent:3
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:11 目标节点:12
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:7 Val:12
当前队列:[1,3,5,11,4,6,7,12,null,null,null]

17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】元素:15 当前队列:[1,3,5,11,4,6,7,12,null,null,null]
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:8 parent:3
17:21:30.056 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:11 目标节点:15
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:8 Val:15
当前队列:[1,3,5,11,4,6,7,12,15,null,null]

17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】元素:10 当前队列:[1,3,5,11,4,6,7,12,15,null,null]
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:9 parent:4
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:4 目标节点:10
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:9 Val:10
当前队列:[1,3,5,11,4,6,7,12,15,10,null]

17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】元素:9 当前队列:[1,3,5,11,4,6,7,12,15,10,null]
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:10 parent:4
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:4 目标节点:9
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:10 Val:9
当前队列:[1,3,5,11,4,6,7,12,15,10,9]

17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】元素:8 当前队列:[1,3,5,11,4,6,7,12,15,10,9,null,null,null,null,null,null,null,null,null,null,null,null,null]
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:11 parent:5
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:6 目标节点:8
17:21:30.057 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:11 Val:8
当前队列:[1,3,5,11,4,6,7,12,15,10,9,8,null,null,null,null,null,null,null,null,null,null,null,null]

17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:1 下节点:3 位置替换
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:11 right:4
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:3 下节点:4 位置替换
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:10 right:9
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:4 Val:8
17:21:30.057 [main] INFO heap.__test__.HeapTest – 测试结果:1
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:3 下节点:4 位置替换
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:11 right:8
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:4 下节点:8 位置替换
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:4 Val:9
17:21:30.057 [main] INFO heap.__test__.HeapTest – 测试结果:3
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:8 right:5
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:4 下节点:5 位置替换
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:5 下节点:6 位置替换
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:5 Val:10
17:21:30.057 [main] INFO heap.__test__.HeapTest – 测试结果:4
17:21:30.057 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:8 right:6
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:5 下节点:6 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:10 right:7
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:6 下节点:7 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:6 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 测试结果:5
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:8 right:7
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:6 下节点:7 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:7 下节点:10 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:5 Val:12
17:21:30.058 [main] INFO heap.__test__.HeapTest – 测试结果:6
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:7 下节点:8 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:11 right:9
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:8 下节点:9 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:4 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 测试结果:7
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:8 下节点:9 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:9 下节点:11 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:3 Val:12
17:21:30.058 [main] INFO heap.__test__.HeapTest – 测试结果:8
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:11 right:10
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:9 下节点:10 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:2 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 测试结果:9
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:10 下节点:11 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:1 Val:12
17:21:30.058 [main] INFO heap.__test__.HeapTest – 测试结果:10
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:11 下节点:12 位置替换
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:1 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 测试结果:11
17:21:30.058 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:0 Val:15
17:21:30.058 [main] INFO heap.__test__.HeapTest – 测试结果:12
17:21:30.058 [main] INFO heap.__test__.HeapTest – 测试结果:15

Process finished with exit code 0
小堆就是一个正序的输出结果,从小到大的排序和输出。
小堆空间:[1,3,5,11,4,6,7,12,15,10,9,8,null,null,null,null,null,null,null,null,null,null,null,null]小堆就是一个正序的输出结果,从小到大的排序和输出。小堆空间:[1,3,5,11,4,6,7,12,15,10,9,8,null,null,null,null,null,null,null,null,null,null,null,null]小堆是一个反序比对测试结果17:23:45.079 [main] INFO queue.PriorityQueue – 【入队】元素:3 当前队列:[1,null,null,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:1 parent:0
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:1 存放到位置:1
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:0 Val:3
当前队列:[3,1,null,null,null,null,null,null,null,null,null]

17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】元素:5 当前队列:[3,1,null,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:2 parent:0
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:3 存放到位置:2
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:0 Val:5
当前队列:[5,1,3,null,null,null,null,null,null,null,null]

17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】元素:11 当前队列:[5,1,3,null,null,null,null,null,null,null,null]
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:3 parent:1
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:1 存放到位置:3
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:1 parent:0
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:5 存放到位置:1
17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:0 Val:11
当前队列:[11,5,3,1,null,null,null,null,null,null,null]

17:23:45.081 [main] INFO queue.PriorityQueue – 【入队】元素:4 当前队列:[11,5,3,1,null,null,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:4 parent:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:5 目标节点:4
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:4 Val:4
当前队列:[11,5,3,1,4,null,null,null,null,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】元素:6 当前队列:[11,5,3,1,4,null,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:5 parent:2
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:3 存放到位置:5
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:2 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:11 目标节点:6
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:2 Val:6
当前队列:[11,5,6,1,4,3,null,null,null,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】元素:7 当前队列:[11,5,6,1,4,3,null,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:6 parent:2
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:6 存放到位置:6
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:2 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:11 目标节点:7
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:2 Val:7
当前队列:[11,5,7,1,4,3,6,null,null,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】元素:12 当前队列:[11,5,7,1,4,3,6,null,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:7 parent:3
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:1 存放到位置:7
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:3 parent:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:5 存放到位置:3
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:1 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:11 存放到位置:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:0 Val:12
当前队列:[12,11,7,5,4,3,6,1,null,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】元素:15 当前队列:[12,11,7,5,4,3,6,1,null,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:8 parent:3
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:5 存放到位置:8
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:3 parent:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:11 存放到位置:3
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:1 parent:0
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:12 存放到位置:1
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:0 Val:15
当前队列:[15,12,7,11,4,3,6,1,5,null,null]

17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】元素:10 当前队列:[15,12,7,11,4,3,6,1,5,null,null]
17:23:45.082 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:9 parent:4
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:4 存放到位置:9
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:4 parent:1
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:12 目标节点:10
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:4 Val:10
当前队列:[15,12,7,11,10,3,6,1,5,4,null]

17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】元素:9 当前队列:[15,12,7,11,10,3,6,1,5,4,null]
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:10 parent:4
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:10 目标节点:9
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:10 Val:9
当前队列:[15,12,7,11,10,3,6,1,5,4,9]

17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】元素:8 当前队列:[15,12,7,11,10,3,6,1,5,4,9,null,null,null,null,null,null,null,null,null,null,null,null,null]
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:11 parent:5
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:3 存放到位置:11
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:5 parent:2
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】替换过程,父子节点位置替换,继续循环。父节点值:7 存放到位置:5
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】寻找当前节点的父节点位置。k:2 parent:0
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】值比对,父节点:15 目标节点:8
17:23:45.083 [main] INFO queue.PriorityQueue – 【入队】完成 Idx:2 Val:8
当前队列:[15,12,8,11,10,7,6,1,5,4,9,3,null,null,null,null,null,null,null,null,null,null,null,null]

17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:15 下节点:12 位置替换
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:12 下节点:11 位置替换
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:1 right:5
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:11 下节点:5 位置替换
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:8 Val:3
17:23:45.083 [main] INFO heap.__test__.HeapTest – 测试结果:15
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:12 下节点:11 位置替换
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:5 right:10
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:11 下节点:10 位置替换
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:4 Val:9
17:23:45.083 [main] INFO heap.__test__.HeapTest – 测试结果:12
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:11 下节点:10 位置替换
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:5 right:9
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:10 下节点:9 位置替换
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:4 Val:4
17:23:45.083 [main] INFO heap.__test__.HeapTest – 测试结果:11
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:10 下节点:9 位置替换
17:23:45.083 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:9 下节点:5 位置替换
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:3 Val:3
17:23:45.084 [main] INFO heap.__test__.HeapTest – 测试结果:10
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:5 right:8
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:9 下节点:8 位置替换
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:8 下节点:7 位置替换
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:5 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest – 测试结果:9
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:5 right:7
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:8 下节点:7 位置替换
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:2 Val:6
17:23:45.084 [main] INFO heap.__test__.HeapTest – 测试结果:8
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】左右子节点比对,获取最小值。left:5 right:6
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:7 下节点:6 位置替换
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:2 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest – 测试结果:7
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:6 下节点:5 位置替换
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:1 Val:4
17:23:45.084 [main] INFO heap.__test__.HeapTest – 测试结果:6
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:5 下节点:4 位置替换
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:1 Val:3
17:23:45.084 [main] INFO heap.__test__.HeapTest – 测试结果:5
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换过程,节点的值比对。上节点:4 下节点:3 位置替换
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:1 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest – 测试结果:4
17:23:45.084 [main] INFO queue.PriorityQueue – 【出队】替换结果,最终更换位置。Idx:0 Val:1
17:23:45.084 [main] INFO heap.__test__.HeapTest – 测试结果:3
17:23:45.084 [main] INFO heap.__test__.HeapTest – 测试结果:1

Process finished with exit code 0大堆就是一个反序的输出结果,从大到小的排序和输出。大堆空间:[15,12,8,11,10,7,6,1,5,4,9,3,null,null,null,null,null,null,null,null,null,null,null,null]到此,关于“Java数据结构之最小堆和最大堆怎么实现”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注百云主机网站,小编会继续努力为大家带来更多实用的文章!

相关推荐: JavaScript怎么自定义日历实现签到功能

本篇内容介绍了“JavaScript怎么自定义日历实现签到功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果图免费云主机域名红色块为已签到的日期,样式可以随…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/01 11:53
下一篇 04/01 11:54

相关推荐