]> Cypherpunks repositories - gostls13.git/commitdiff
container/heap: remove one unnecessary comparison in Fix
authorSina Siadat <siadat@gmail.com>
Mon, 20 Jun 2016 20:24:52 +0000 (00:54 +0430)
committerRobert Griesemer <gri@golang.org>
Tue, 16 Aug 2016 00:40:03 +0000 (00:40 +0000)
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/24273
Reviewed-by: Robert Griesemer <gri@golang.org>
src/container/heap/heap.go

index 5fe23b95372bd42e835a81e2989438e39ed7242f..7110c513f0870fd86493fc1f32aee41bdffc7fdd 100644 (file)
@@ -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.
 // The complexity is O(log(n)) where n = h.Len().
 func Fix(h Interface, i int) {
-       down(h, i, h.Len())
-       up(h, i)
+       if !down(h, i, h.Len()) {
+               up(h, i)
+       }
 }
 
 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 {
                j1 := 2*i + 1
                if j1 >= n || j1 < 0 { // j1 < 0 after int overflow
@@ -114,4 +116,5 @@ func down(h Interface, i, n int) {
                h.Swap(i, j)
                i = j
        }
+       return i > i0
 }