Karşılaştırma Yapmadan O(n) Sıralama!
Karşılaştırma yok!
Linear zaman!
Sıra korunur
Sadece integer
Counting Sort, elemanları karşılaştırmadan sıralayan özel bir algoritmadır. Her elemanın kaç kez göründüğünü sayar ve bu bilgiyi kullanarak doğrudan doğru pozisyona yerleştirir.
Karşılaştırma tabanlı sıralama algoritmaları (Quick, Merge, Heap) en iyi O(n log n) yapabilir. Bu matematiksel bir alt sınırdır!
Ama Counting Sort karşılaştırma yapmaz, bu yüzden bu sınırı aşabilir: O(n)!
0'dan k'ya (max değer) kadar bir count dizisi oluştur, hepsini 0 ile başlat.
Orijinal dizideki her eleman için, count dizisinde ilgili indeksi artır.
Count dizisini kümülatif toplama dönüştür. Bu, her elemanın çıktıda nereye gideceğini söyler.
Orijinal diziyi sondan başa tara (stability için), her elemanı doğru pozisyona yerleştir.
Diziyi sıralayalım: [4, 2, 2, 8, 3, 3, 1]
Her elemanı say (max = 8, yani 0-8 arası count dizisi):
Her indeks, o değerin çıktıda "son pozisyonunu" gösterir:
O(n + k)
n = eleman sayısı, k = aralık
O(n + k)
count + output dizileri
✅ Evet
Sondan başa tarama ile
# ====================================
# COUNTING SORT ALGORİTMASI
# ====================================
def counting_sort(arr):
"""
Counting Sort - Non-comparison sıralama
Zaman: O(n + k) - n: eleman sayısı, k: değer aralığı
Alan: O(n + k) - count ve output dizileri
Stable: Evet (sondan başa tarama ile)
Kısıtlamalar:
- Sadece non-negative integer
- k çok büyükse verimsiz
"""
if len(arr) == 0:
return arr
# Adım 1: Min ve max bul
min_val = min(arr)
max_val = max(arr)
k = max_val - min_val + 1 # Aralık
print(f"📊 Dizi: {arr}")
print(f" Min: {min_val}, Max: {max_val}, Aralık (k): {k}")
# Adım 2: Sayma dizisi oluştur
count = [0] * k
# Adım 3: Elemanları say
for x in arr:
count[x - min_val] += 1
print(f"\n🔢 Sayma dizisi: {count}")
# Adım 4: Kümülatif toplam
for i in range(1, k):
count[i] += count[i - 1]
print(f"📈 Kümülatif: {count}")
# Adım 5: Çıktı dizisi oluştur (sondan başa - stability için)
output = [0] * len(arr)
for i in range(len(arr) - 1, -1, -1):
x = arr[i]
idx = x - min_val
output[count[idx] - 1] = x
count[idx] -= 1
print(f"\n✅ Sıralı: {output}")
return output
# ============ TEST ============
print("=" * 50)
print("COUNTING SORT")
print("=" * 50)
dizi = [4, 2, 2, 8, 3, 3, 1]
counting_sort(dizi)
print("\n" + "=" * 50)
print("NEGATİF SAYILARLA TEST")
print("=" * 50)
dizi2 = [4, -2, 2, -8, 3, -3, 1]
counting_sort(dizi2)
Milyonlarca öğrencinin sınav notunu (0-100) sırala. k=101, O(n) zaman!
Veri dağılımını göster. Counting Sort'un sayma adımı histogram verir!
Her basamak için Counting Sort kullanır. 0-9 arası, k=10.
Görüntü işleme. RGB değerleri 0-255 arası, k=256.
Say, kümüla, yerleştir
O(n + k)
O(n + k)
Stable, sadece integer