|
@@ -325,7 +325,53 @@ rootIndex = childIndex
|
|
|
|
|
|
```
|
|
|
|
|
|
+4<9,父节点并不大于子节点,因此将其互换并将子节点设为父节点继续循环
|
|
|
+```go
|
|
|
+childIndex := 2*rootIndex + 1
|
|
|
+if childIndex >= hi {
|
|
|
+ break
|
|
|
+}
|
|
|
+1
|
|
|
+2
|
|
|
+3
|
|
|
4
|
|
|
+```
|
|
|
+下标9的子节点下标为19,大于堆的长度10,不存在该子节点退出循环。
|
|
|
+array此时为[5, 4, 6, 7, 9, 3, 4, 8, 2, 0]
|
|
|
+
|
|
|
+逼逼赖赖这么多不如放张图:
|
|
|
+
|
|
|
+图实在是占地方了,后续循环我就不放图了,给你们个结果切片[]int自己转换,看一看就懂了。
|
|
|
+
|
|
|
+初始值 [5 4 6 7 0 3 4 8 2 9]
|
|
|
+
|
|
|
+调用siftDown(array, 4 , 10 )
|
|
|
+交换后结果 [5 4 6 7 9 3 4 8 2 0] 继续循环
|
|
|
+rootIndex: 9 没有子节点退出循环
|
|
|
+
|
|
|
+调用siftDown(array, 3 , 10 )
|
|
|
+交换后结果 [5 4 6 8 9 3 4 7 2 0] 继续循环
|
|
|
+rootIndex: 7 没有子节点退出循环
|
|
|
+
|
|
|
+调用siftDown(array, 2 , 10 )
|
|
|
+child兄弟节点更大,选择该兄弟节点childIndex: 6
|
|
|
+父节点比子节点大退出循环
|
|
|
+
|
|
|
+调用siftDown(array, 1 , 10 )
|
|
|
+child兄弟节点更大,选择该兄弟节点childIndex: 4
|
|
|
+交换后结果 [5 9 6 8 4 3 4 7 2 0] 继续循环
|
|
|
+父节点比子节点大退出循环
|
|
|
+
|
|
|
+调用siftDown(array, 0 , 10 )
|
|
|
+交换后结果 [9 5 6 8 4 3 4 7 2 0] 继续循环
|
|
|
+交换后结果 [9 8 6 5 4 3 4 7 2 0] 继续循环
|
|
|
+交换后结果 [9 8 6 7 4 3 4 5 2 0] 继续循环
|
|
|
+rootIndex: 7 没有子节点退出循环
|
|
|
+最后获取得的 [9 8 6 7 4 3 4 5 2 0] 就是大顶堆,父节点皆比子节点大。
|
|
|
+排序我就不举例了,都是一个意思。如果还看不懂就把切片换成堆结构你就明白了。
|
|
|
|
|
|
+结束
|
|
|
+以后有机会可以把sort包拿出来说说。
|
|
|
+————————————————
|
|
|
|
|
|
-> 原文地址 https://blog.csdn.net/BangBrother/article/details/106866823
|
|
|
+> 原文链接:https://blog.csdn.net/BangBrother/java/article/details/106866823
|