]> granicus.if.org Git - python/commitdiff
heappop(): Added comments; simplified and sped the code.
authorTim Peters <tim.peters@gmail.com>
Fri, 2 Aug 2002 20:09:14 +0000 (20:09 +0000)
committerTim Peters <tim.peters@gmail.com>
Fri, 2 Aug 2002 20:09:14 +0000 (20:09 +0000)
Lib/heapq.py

index 524f65ce09156c9c151acbe6c9f338d867f3ee57..91dc81bd5187cf5be4cab23262a5eea71701f5bb 100644 (file)
@@ -142,27 +142,25 @@ def heappop(heap):
     returnitem = heap[0]
     item = heap.pop()
     pos = 0
-    while True:
-        child2pos = (pos + 1) * 2
-        child1pos = child2pos - 1
-        if child2pos < endpos:
-            child1 = heap[child1pos]
-            child2 = heap[child2pos]
-            if item <= child1 and item <= child2:
-                break
-            if child1 < child2:
-                heap[pos] = child1
-                pos = child1pos
-                continue
-            heap[pos] = child2
-            pos = child2pos
-            continue
-        if child1pos < endpos:
-            child1 = heap[child1pos]
-            if child1 < item:
-                heap[pos] = child1
-                pos = child1pos
-        break
+    # Sift item into position, down from the root, moving the smaller
+    # child up, until finding pos such that item <= pos's children.
+    childpos = 2*pos + 1    # leftmost child position
+    while childpos < endpos:
+        # Set childpos and child to reflect smaller child.
+        child = heap[childpos]
+        rightpos = childpos + 1
+        if rightpos < endpos:
+            rightchild = heap[rightpos]
+            if rightchild < child:
+                childpos = rightpos
+                child = rightchild
+        # If item is no larger than smaller child, we're done, else
+        # move the smaller child up.
+        if item <= child:
+            break
+        heap[pos] = child
+        pos = childpos
+        childpos = 2*pos + 1
     heap[pos] = item
     return returnitem