3.6.8 · Coding › Sorting & Searching
Agar values uniformly ek range mein scattered hain, toh us range ko n equal slots ("buckets") mein kaat do — har bucket mein roughly ek item aata hai. Har chote bucket ko sort karna almost kuch nahi lagta, aur sorted buckets ko concatenate karne se final answer milta hai. Bucket sort O ( n log n ) comparison sorts ko is liye beat karta hai kyunki yeh input distribution ki knowledge ko exploit karta hai — yeh har pair ko compare nahi karta; balki value ko hi ek address ki tarah use karta hai.
Ek distribution sort jo:
n empty buckets (lists) banata hai.
Har element ko bucket index ⌊ n ⋅ x i ⌋ mein scatter karta hai (inputs x i ∈ [ 0 , 1 ) ke liye).
Har bucket ko individually sort karta hai (usually insertion sort se).
Buckets ko in order concatenate karta hai taaki sorted array mile.
Scatter stage par yeh comparison-based nahi hai, isliye Ω ( n log n ) lower bound is par apply nahi hota .
Woh assumption jo ise fast banati hai: inputs ek known interval par uniform distribution se drawn hain, isliye buckets evenly fill hote hain.
Hume expected total cost chahiye. Scatter, concatenation, aur bucket creation — teeno O ( n ) hain. Risky part sirf buckets ko sort karna hai, kyunki size m ke bucket par insertion sort O ( m 2 ) leta hai.
Maano n i = bucket i mein girne wale elements ki sankhya. Total sort cost:
T = O ( n ) + ∑ i = 0 n − 1 O ( n i 2 )
Expectation lo:
E [ T ] = O ( n ) + ∑ i = 0 n − 1 O ( E [ n i 2 ] )
Ab humein E [ n i 2 ] chahiye. n elements mein se har ek independently probability p = 1/ n se bucket i mein girta hai (uniform input → har bucket mein equal chance). Toh n i ∼ Binomial ( n , 1/ n ) .
Identity E [ X 2 ] = Var ( X ) + ( E [ X ] ) 2 use karo:
E [ n i 2 ] = n p ( 1 − p ) + ( n p ) 2
p = 1/ n plug karo:
E [ n i 2 ] = n ⋅ n 1 ( 1 − n 1 ) + ( n ⋅ n 1 ) 2 = ( 1 − n 1 ) + 1 = 2 − n 1
Yahi toh punchline hai: E [ n i 2 ] ek constant hai (< 2 ), n ke saath grow nahi karta. Toh:
E [ T ] = O ( n ) + ∑ i = 0 n − 1 O ( 2 − n 1 ) = O ( n ) + O ( n ) = O ( n )
E [ n i 2 ] → 2 sahi lagta hai
Agar har bucket mein exactly 1 element hota, toh ∑ n i 2 = n hota. Randomness thodi si clumping add karta hai (kuch buckets mein 2 aate hain, kuch mein 0), aur extra variance term ka contribution ≈ n aur hota hai. Toh total quadratic work ≈ 2 n hai — phir bhi linear.
def bucket_sort (a): # a: list of floats in [0, 1)
n = len (a)
buckets = [[] for _ in range (n)] # n empty buckets
for x in a:
buckets[ int (n * x)].append(x) # scatter: index = floor(n*x)
out = []
for b in buckets:
b.sort() # insertion sort in practice
out.extend(b) # concatenate in order
return out
int(n*x) kyun? [ 0 , 1 ) ko n se stretch karne par value directly ek bucket address par map ho jaati hai, isliye equal-width slots equal value-ranges ke correspond karte hain.
Worked example Worked example —
n = 10
Input: [0.78, 0.17, 0.39, 0.26, 0.72, 0.94, 0.21, 0.12, 0.23, 0.68]
Step — scatter (index = ⌊ 10 x ⌋ ):
bucket 1: 0.17 , 0.12 (Kyun? ⌊ 10 ⋅ 0.17 ⌋ = 1 )
bucket 2: 0.26 , 0.21 , 0.23
bucket 3: 0.39
bucket 6: 0.68
bucket 7: 0.78 , 0.72
bucket 9: 0.94
Step — har bucket sort karo: bucket 1 → 0.12 , 0.17 ; bucket 2 → 0.21 , 0.23 , 0.26 .
Kyun sasta? Har bucket mein ≤ 3 items hain; 3 items par insertion sort trivial hai.
Step — bucket order mein concatenate karo:
0.12 , 0.17 , 0.21 , 0.23 , 0.26 , 0.39 , 0.68 , 0.72 , 0.78 , 0.94 ✅ sorted.
Worked example Range generalize karna
[ 0 , 1 ) ki jagah [ l o , hi ) mein inputs ke liye, pehle map karo:
index = ⌊ n ⋅ hi − l o x − l o ⌋
Yeh step kyun? Yeh value ko bucketing se pehle [ 0 , 1 ) mein normalize karta hai, taaki slots original units mein equal-width rahein.
Common mistake "Bucket sort hamesha
O ( n ) hai."
Kyun sahi lagta hai: average-case proof O ( n ) deta hai, aur log ise the complexity ki tarah quote karte hain.
Fix: Woh bound uniform input assume karta hai . Agar saare elements ek bucket mein clump ho jayein (e.g. skewed/adversarial data), toh ek bucket mein saare n items hain aur insertion sort use O ( n 2 ) bana deta hai. Worst case O ( n 2 ) hai. Bucket sort ki speed ek distribution assumption hai, guarantee nahi.
Common mistake "Zyada buckets hamesha better hote hain."
Kyun sahi lagta hai: zyada buckets → kam collisions → kam per-bucket work.
Fix: Buckets banane aur concatenate karne mein O ( # buckets ) lagta hai. ≫ n buckets use karna empty buckets par memory/time waste karta hai. Sweet spot ≈ n buckets hai: expected element ke hisaab se ek per element.
int(n*x) use karna jab x max ke equal ho sakta hai.
Kyun sahi lagta hai: formula interior values ke liye "just works" karta hai.
Fix: Agar x = 1.0 (ya x = hi ) ho, toh ⌊ n ⋅ 1 ⌋ = n out of range hai. Half-open interval [ 0 , 1 ) use karo, ya clamp karo: idx = min(idx, n-1).
Recall Feynman: ek 12-saal ke bachche ko samjhao
Socho 100 bacche hain, har ek ke paas 0 se 99 tak koi number likha card hai, aur tumhe unhe smallest se largest mein line mein lagana hai. Cards ek-ek karke compare karne ki jagah, tum 100 labeled boxes rakh do (0,1,2,...). Har bachcha apna card us box mein daalta hai jo uske number ke pehle digit se match kare. Kyunki numbers evenly spread hain, almost har box mein sirf ek card aata hai. Phir boxes ko left se right padhte jao — ho gaya! Trick yeh hai: number khud batata hai kahan jaana hai , isliye sort almost karna hi nahi padta.
Mnemonic 4 S's yaad rakho
S catter → S ort each → S tring together. Aur rule: "Spread evenly = Speedy" (uniform ⇒ O ( n ) ); "Clumped = Crawls" (skewed ⇒ O ( n 2 ) ).
Kaun si input assumption bucket sort ko O ( n ) banati hai?
Ω ( n log n ) lower bound kyun apply nahi hota?
E [ n i 2 ] kya hai aur yeh constant kyun rehta hai?
Bucket sort: kaun si input distribution expected O ( n ) deti hai? Ek known range par uniform distribution (taaki buckets evenly fill hon).
Bucket sort: n buckets ke saath x ∈ [ 0 , 1 ) value ke liye bucket index ka formula? ⌊ n ⋅ x ⌋ .
Bucket sort: worst-case time aur kab hota hai? O ( n 2 ) , jab saare elements ek bucket mein girte hain (skewed/adversarial input).
Comparison-sort lower bound Ω ( n log n ) bucket sort par kyun apply nahi hota? Scatter step value ko address ki tarah use karta hai (comparisons nahi), isliye yeh comparison sort nahi hai.
n i ∼ Binomial ( n , 1/ n ) ke liye, E [ n i 2 ] kya hai?2 − 1/ n (ek constant < 2 ), isliye total sort work O ( n ) hai.
E [ X 2 ] , variance aur mean ko kaun si identity link karti hai?E [ X 2 ] = Var ( X ) + ( E [ X ] ) 2 .
Roughly kitne buckets use karne chahiye, aur kyun? ≈ n — expected element ke hisaab se ek; bahut kam se collisions hote hain, bahut zyada se empty buckets par time waste hota hai.
[ 0 , 1 ) ki jagah [ l o , hi ) mein values ko bucket-sort kaise karte hain?Index = ⌊ n ( x − l o ) / ( hi − l o )⌋ (pehle normalize karo).
Kya bucket sort stable hai? Haan, agar har bucket ka internal sort stable ho aur elements insertion order maintain karein.
E X2 = Var + mean squared
About one item per bucket
E of n_i squared = 2 - 1/n
Omega n log n does not apply