Array kyun, pointers kyun nahi? Ek complete tree mein koi hole nahi hota — har level full hoti hai sivaaye possibly last level ke, jo left-to-right bhari jaati hai. Woh regular shape matlab hum child/parent positions arithmetic se calculate kar sakte hain, toh hume zero pointers aur zero extra memory chahiye. Yahi hai "in-place" ka raaz.
Recall Kyun
parent = (i-1)/2 hai?
p ka left child 2p+1 hai, right 2p+2 hai. Dono ko invert karo: 2p+1 se p=(i−1)/2 milta hai; 2p+2 se p=(i−2)/2 milta hai. (i−1)/2 ka integer floor division dono cases ko ek formula mein combine kar deta hai.
Root (max) ko last heap slot se swap karo, heap ko ek se chhota karo, naye root ko neeche sift karo. Repeat karo.
Dono ke liye main engine hai sift-down (a.k.a. max_heapify).
def sift_down(A, i, n): # heap occupies A[0..n-1] while True: l, r = 2*i + 1, 2*i + 2 largest = i if l < n and A[l] > A[largest]: largest = l if r < n and A[r] > A[largest]: largest = r if largest == i: break # heap property restored A[i], A[largest] = A[largest], A[i] i = largest # follow the swap downwarddef heap_sort(A): n = len(A) # Phase 1: build max-heap, bottom-up from last parent for i in range(n//2 - 1, -1, -1): sift_down(A, i, n) # Phase 2: extract max repeatedly for end in range(n - 1, 0, -1): A[0], A[end] = A[end], A[0] # biggest -> sorted tail sift_down(A, 0, end) # restore heap of size `end`
Naive guess:n nodes ×logn = O(nlogn). Tight truth: zyaatar nodes bottom ke paas hote hain aur sift-down thoda hi karta hai.
Bottom se height h par zyada se zyada ⌈n/2h+1⌉ nodes hote hain, har ek ka cost O(h):
Tbuild=∑h=0⌊logn⌋2h+1nO(h)=O(n∑h=0∞2hh).
Ab series evaluate karo. Maano S=∑h≥0hxh=(1−x)2x. x=21 par: S=(1/2)21/2=2. Isliye
Tbuild=O(2n)=O(n).
Nahi — sifting swaps equal keys ka order bigaad dete hain.
Node i (0-based) ke left child ka index
2i+1.
Node i (0-based) ke parent ka index
⌊(i−1)/2⌋.
Build-heap loop kahaan se shuru hoti hai?
Last internal node se, index ⌊n/2⌋−1, neeche 0 tak.
Build-heap O(n) kyun hai, O(nlogn) kyun nahi?
Zyaatar nodes bottom ke paas hain; ∑h(n/2h+1)⋅h=O(n) kyunki ∑h/2h=2.
Sift-down ka precondition kya hai?
Node i ke dono subtrees already valid heaps hain.
Phase 2 step ek line mein
Root ko last heap slot se swap karo, heap chhota karo, naye root ko sift-down karo.
Ascending sort ke liye max-heap vs min-heap?
Max-heap use karo; har round mein sabse bada end mein park hota hai.
Heap array mein store — pointers kyun nahi?
Yeh complete tree hai, toh child/parent positions pure index arithmetic se milti hain.
Recall Feynman: ek 12-saal ke bacche ko samjhao
Socho numbered cards ka ek pyramid hai, jisme rule hai ki har card apne neeche wale dono cards se bada hota hai. Toh sabse bada card hamesha upar hota hai. Unhe sort karne ke liye: sabse upar wala (sabse bada) card uthao aur apni row ke bilkul end mein rakh do. Ab ek chota card upar aa gaya aur rule toot gaya, toh use "sink" hone do — use neeche wale dono cards mein se bade wale se swap karte raho jab tak pyramid ka rule phir fix na ho jaaye. Ab naya top next-biggest hai; use last wale se thoda pehle park karo. Repeat karo jab tak pyramid khaali na ho — teri row sort ho gayi, aur tujhe iske liye koi doosri table nahi chahiye thi!