Commit b98d8cd5 authored by Sina Siadat's avatar Sina Siadat Committed by Robert Griesemer

container/heap: remove one unnecessary comparison in Fix

The heap.Fix function calls both down and up.  If the element is moved
down, we don't need to call up and we could save a comparison.

(per suggestion by Radu Berinde)

Fixes #16098.

Change-Id: I83a74710e66cf0d274d8c0743338c26f89f31afe
Reviewed-on: https://go-review.googlesource.com/24273Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent b5e43e66
...@@ -83,8 +83,9 @@ func Remove(h Interface, i int) interface{} { ...@@ -83,8 +83,9 @@ func Remove(h Interface, i int) interface{} {
// but less expensive than, calling Remove(h, i) followed by a Push of the new value. // but less expensive than, calling Remove(h, i) followed by a Push of the new value.
// The complexity is O(log(n)) where n = h.Len(). // The complexity is O(log(n)) where n = h.Len().
func Fix(h Interface, i int) { func Fix(h Interface, i int) {
down(h, i, h.Len()) if !down(h, i, h.Len()) {
up(h, i) up(h, i)
}
} }
func up(h Interface, j int) { func up(h Interface, j int) {
...@@ -98,7 +99,8 @@ func up(h Interface, j int) { ...@@ -98,7 +99,8 @@ func up(h Interface, j int) {
} }
} }
func down(h Interface, i, n int) { func down(h Interface, i0, n int) bool {
i := i0
for { for {
j1 := 2*i + 1 j1 := 2*i + 1
if j1 >= n || j1 < 0 { // j1 < 0 after int overflow if j1 >= n || j1 < 0 { // j1 < 0 after int overflow
...@@ -114,4 +116,5 @@ func down(h Interface, i, n int) { ...@@ -114,4 +116,5 @@ func down(h Interface, i, n int) {
h.Swap(i, j) h.Swap(i, j)
i = j i = j
} }
return i > i0
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment