Basamak Basamak Sıralayarak O(d·n) Zaman!
LSD vs MSD
d: basamak sayısı
Counting Sort ile
Counting Sort'tan iyi
Radix Sort, sayıları basamak basamak sıralayan bir algoritmadır. Her basamak için stable bir sıralama (genellikle Counting Sort) kullanır.
Düşün: [170, 45, 75, 90, 802, 24, 2, 66] dizisini sıralamak istiyorsun.
Least Significant Digit - En sağdaki (birler) basamaktan başla. En yaygın kullanılan.
Most Significant Digit - En soldaki basamaktan başla. String sıralamasında kullanılır.
En büyük sayının kaç basamaklı olduğunu bul. Bu kadar tur döneceğiz.
Birler basamağından başla, her basamak için stable sıralama yap.
Önceki basamaklardaki sırayı korumak için! Birler basamağında [45, 75] sıralıydı. Onlar basamağında ikisi de 4-7 ama stability sayesinde sıra bozulmaz.
Diziyi sıralayalım: [170, 45, 75, 90, 802, 24, 2, 66]
Her sayının birler basamağına bak:
Her sayının onlar basamağına bak (tek basamaklılar için 0):
Her sayının yüzler basamağına bak:
O(d·n)
d: basamak, n: eleman
O(n + k)
k: taban (genelde 10)
✅ Evet
Counting Sort kullanılırsa
d = basamak sayısı = log10(max_value)
# ====================================
# RADIX SORT (LSD) ALGORİTMASI
# ====================================
def counting_sort_by_digit(arr, exp):
"""
Belirli bir basamağa göre Counting Sort uygula.
exp: 1 (birler), 10 (onlar), 100 (yüzler), ...
"""
n = len(arr)
output = [0] * n
count = [0] * 10 # 0-9 arası basamaklar
# Sayma: Her basamağın kaç kez göründüğünü say
for num in arr:
digit = (num // exp) % 10
count[digit] += 1
# Kümülatif toplam
for i in range(1, 10):
count[i] += count[i - 1]
# Çıktı oluştur (sondan başa - stability için)
for i in range(n - 1, -1, -1):
digit = (arr[i] // exp) % 10
output[count[digit] - 1] = arr[i]
count[digit] -= 1
# Orijinal diziye kopyala
for i in range(n):
arr[i] = output[i]
def radix_sort(arr):
"""
Radix Sort (LSD - Least Significant Digit)
Zaman: O(d * n) - d: basamak sayısı
Alan: O(n + 10) = O(n)
Stable: Evet
"""
if len(arr) == 0:
return arr
# Maksimum değeri bul (basamak sayısı için)
max_val = max(arr)
print(f"📊 Orijinal: {arr}")
print(f" Max değer: {max_val}")
print("=" * 50)
# Her basamak için Counting Sort
exp = 1 # Birler, onlar, yüzler...
digit_pos = 1
while max_val // exp > 0:
print(f"\n🔵 Tur {digit_pos}: {'Birler' if exp == 1 else 'Onlar' if exp == 10 else 'Yüzler' if exp == 100 else f'{exp}ler'} basamağı (exp={exp})")
counting_sort_by_digit(arr, exp)
print(f" Sonuç: {arr}")
exp *= 10
digit_pos += 1
return arr
# ============ TEST ============
print("🔢 RADIX SORT (LSD)")
print("=" * 50)
dizi = [170, 45, 75, 90, 802, 24, 2, 66]
radix_sort(dizi)
print(f"\n✅ Sıralı dizi: {dizi}")
print("\n" + "=" * 50)
print("BÜYÜK SAYILARLA TEST")
print("=" * 50)
dizi2 = [329, 457, 657, 839, 436, 720, 355]
radix_sort(dizi2)
print(f"\n✅ Sıralı dizi: {dizi2}")
| Özellik | Counting Sort | Radix Sort |
|---|---|---|
| Zaman | O(n + k) | O(d·n) |
| Alan | O(k) | O(n + 10) ≈ O(n) |
| [0, 100] arası | ✅ İdeal (k=101) | Gereksiz |
| [0, 10⁹] arası | ❌ k çok büyük! | ✅ d=10 tur yeterli |
Basamak basamak Counting Sort
O(d·n)
O(n + k)
Stable, büyük int için ideal