Bladeren bron

更新 '_posts/go-5.md'

aaronwei 5 jaren geleden
bovenliggende
commit
962091a73b
1 gewijzigde bestanden met toevoegingen van 47 en 1 verwijderingen
  1. 47 1
      _posts/go-5.md

+ 47 - 1
_posts/go-5.md

@@ -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