Typical solution
, , .
, min-heap O (log n), , .
, - : "siftup" "siftdown" ( , ). , .
1:
x1 x0, x, parent(x) <= x0 < x1
. x , x , x , .
2:
x1 x, x , x1 < x0 <= either_child(x)
. , x , x . Sibling , , .
3:
. .
Python
1,000,000 : . . . , -.
from heapq import _siftup, _siftdown, heapify
from random import random, randrange, choice
def is_minheap(arr):
return all(arr[i] >= arr[(i-1)//2] for i in range(1, len(arr)))
n = 40
trials = 1_000_000
for _ in range(trials):
data = [random() for i in range(n)]
heapify(data)
i = randrange(n)
x0 = data[i]
x1 = data[i] = choice(data)
if x1 > x0:
_siftup(data, i)
elif x1 < x0:
_siftdown(data, 0, i)
assert is_minheap(data), direction