[5, 9, 1, 7, 3] dizisi pivot 5 ile bölümlenirse pivot hangi indekse yerleşir?
5’ten küçük iki eleman var (1 ve 3) → sıralı dizide 5’in yeri 2 numaralı indeks. Bölümleme, pivotu tam sıralı dizideki yerine koyar (geri kalanlar henüz sırasız olsa bile). Örneğin sonuç: [1, 3, 5, 7, 9] ya da [3, 1, 5, 9, 7].
LEVEL 1
Quicksort
böl, sonra iki tarafı (özyinelemeyle) sırala
bölümleme
quicksort
analiz
iyileştirmeler
tekrar eden anahtarlar
seçim (quickselect)
oyunda bölümleme
sistem sıralamaları
Quicksort — kod
Diziyi karıştır (neden? birazdan!)
Bölümle: pivot son yerine otursun
Solu ve sağı özyinelemeyle sırala
Mergesort ile karşılaştırmaMergesort: önce sırala, sonra işi yap (birleştir). Quicksort: önce işi yap (bölümle), sonra sırala. Birleştirme adımı yok, ek dizi yok!
İz tablosu: quicksort
kırmızı = bu adımda son yerine oturan pivot · siyah = bölümlenen parça a[lo…hi] · gri = bu adımın dışı
Quicksort — animasyon
pivotkarşılaştırılantakaslananşu an bölümlenen parça
📜 Tony Hoare, Moskova, 1960
Genç İngiliz bilgisayar bilimci Tony Hoare, Moskova Devlet Üniversitesi’nde Rusça–İngilizce makine çevirisi üzerinde çalışıyordu. Çevrilecek cümledeki kelimeleri, manyetik şeritteki sözlükte aramadan önce sıralaması gerekiyordu.
Insertion sort çok yavaştı. Hoare quicksort’u buldu — ama dönemin dillerinde özyineleme yoktu, programı yazamadı! İngiltere’ye dönüp özyinelemeli ALGOL 60’ı öğrenince yazabildi.
💸 “Milyar dolarlık hatam”Hoare 1965’te bir programlama diline null referansı ekledi, çünkü “gerçekleştirmesi çok kolaydı”. 2009’da bunun “milyar dolarlık hatası” olduğunu söyledi: NullReferenceException hatalarının (bağlı listeler dersi!) atası.
LEVEL 2
Analiz
en iyi N lg N · ortalama 1,39 N lg N · en kötü N²/2
bölümleme
quicksort
analiz
iyileştirmeler
tekrar eden anahtarlar
seçim (quickselect)
oyunda bölümleme
sistem sıralamaları
Pivot ne kadar iyi bölüyor?
😀 En iyi durumPivot her seferinde tam ortaya düşer → mergesort gibi ikiye bölünür → ~N lg N karşılaştırma.
😱 En kötü durumPivot her seferinde en küçük eleman (ör. dizi zaten sıralı ve karıştırmadık!) → bir taraf boş, diğeri N−1 → ~N²/2 karşılaştırma. Selection sort kadar yavaş!
📐 Ortalama durum ve karıştırmanın önemi
ÖnermeFarklı anahtarlı N elemanı (karıştırdıktan sonra) sıralarken quicksort ortalama ~2 N ln N ≈ 1,39 N lg N karşılaştırma yapar.
Mergesort’tan %39 daha çok karşılaştırma… ama pratikte daha hızlı: daha az veri taşıma, ek dizi yok, önbellek dostu.
En kötü durum (~N²/2) hâlâ mümkün ama karıştırma sayesinde olasılığı N = 1 milyonda “bilgisayarınıza yıldırım düşmesinden” çok daha düşük.
Ağaçlar dersindeki “rastgele BST’nin ortalama derinliği ~2 ln N” ile aynı matematik! (Pivotlar = BST kökleri.)
⚙️ BellekEk dizi yok (yerinde). Sadece özyineleme yığını: ortalama ~lg N derinlik. Ama en kötü durumda derinlik N → yığın taşması! (Çözüm: küçük tarafa özyineleme, büyük tarafa döngü.)
🧪 Canlı ölçüm
🎬 Ara: dansla quicksort
Quick-sort with Hungarian (Küküllőmenti legényes) folk dance AlgoRythmics (Sapientia Üniversitesi) · 6 dk 54 sn · YouTube’da aç
Pivot şapkayı takan dansçı; soldan ve sağdan gelen dansçılar yer değiştirerek bölümleme yapıyor. Bizim iz tablomuzdaki i ve j işaretçilerinin canlı hâli.
🤔 İzlerkenVideoda pivot hangi eleman seçiliyor? i ve j ne zaman duruyor, ne zaman yer değiştiriyor? Pivot son yerine oturduğunda solundakiler ve sağındakiler hakkında ne biliyoruz?
⚙️ Kötü niyetli girdiler: quicksort’a saldırı
Sabit bir pivot kuralı (ör. “her zaman ilk eleman” ya da “ortadaki”) kullanan bir sıralamaya, onu bilerek yavaşlatan bir girdi hazırlanabilir.
1999’da Doug McIlroy, “Quicksort için öldürücü bir rakip” A Killer Adversary for Quicksort makalesiyle birçok standart kütüphanenin sıralamasını karesel zamana düşürdü.
Bir oyun sunucusu, oyuncudan gelen veriyi böyle bir sıralamayla sıralıyorsa: kötü niyetli oyuncu sunucuyu kilitleyebilir (hizmet engelleme, denial of service).
🛡️ Savunmalar
Karıştır ya da rastgele pivot seç
Introsort (C#, C++): özyineleme çok derinleşirse heapsort’a geç → en kötü N lg N garantisi
Ya da garantili bir algoritma: mergesort/Timsort
Quiz 2 · analiz
Karıştırma yapmayan ve pivotu hep a[lo] seçen quicksort’a zaten sıralı 10.000 elemanlı bir dizi veriliyor. Ne olur?
Her bölümlemede pivot en küçük eleman: sol taraf boş, sağ taraf sadece 1 küçülür. Toplam (N−1)+(N−2)+… ≈ N²/2 karşılaştırma ve N derinlikte özyineleme (C#’ta StackOverflowException riski). Oyun verileri çoğu zaman neredeyse sıralıdır → karıştırma şart!
LEVEL 3
İyileştirmeler
küçük parçalar · üçün ortancası
bölümleme
quicksort
analiz
iyileştirmeler
tekrar eden anahtarlar
seçim (quickselect)
oyunda bölümleme
sistem sıralamaları
İki pratik iyileştirme
1) Küçük parçalara insertion sort~10 elemandan küçük parçalarda özyineleme yükü fazla. Insertion sort’a geç → %20’ye kadar kazanç. (Mergesort’taki ile aynı fikir; .NET bunu ≤ 16 elemanda yapar.)
2) Üçün ortancası median-of-3Pivot olarak ilk, orta ve son elemanın ortancasını seç → pivot ortaya daha yakın düşer, sıralı girdide de iyi çalışır. ~%10 kazanç.
İyileştirmeler — kod
LEVEL 4
Tekrar Eden Anahtarlar
üç yollu bölümleme — Dijkstra’nın Hollanda bayrağı
bölümleme
quicksort
analiz
iyileştirmeler
tekrar eden anahtarlar
seçim (quickselect)
oyunda bölümleme
sistem sıralamaları
Sadece birkaç farklı değer varsa?
🎮 Envanterdeki 10.000 eşyayı nadirliğe göre sıralıyorsunuz: sadece 4 farklı değer (sıradan, nadir, epik, efsanevi). Ya da sprite’ları 3 çizim katmanına göre…
Eşit anahtarlar zaten birbiriyle sıralı! Onları tekrar tekrar bölümlemek gereksiz.
Üç yollu bölümleme: diziyi üçe ayır:
< v
= v (bitti!)
?
> v
Ortadaki “= v” bölgesi bir daha hiç dokunulmaz. k farklı değer varsa çalışma süresi ~N lg k’ya düşer; az farklı değerde neredeyse doğrusal.
📜 Hollanda bayrağı problemiEdsger Dijkstra (yol bulma derslerinden tanıyacağınız!) bu problemi 1976’da kırmızı, beyaz, mavi toplarla anlattı: “Topları tek geçişte, renklerine göre sıraya diz.” Hollanda bayrağının renkleri. 🇳🇱
Üç yollu quicksort — animasyon (az farklı değer)
Üç yollu bölümleme — kod
LEVEL 5
Seçim
quickselect — sıralamadan medyanı ve en iyi k’yı bulmak
bölümleme
quicksort
analiz
iyileştirmeler
tekrar eden anahtarlar
seçim (quickselect)
oyunda bölümleme
sistem sıralamaları
k. en küçüğü bul — tamamen sıralamadan
Bölümlemeden sonra pivot j’de. Aradığımız k:
j == k → bulduk!
j < k → sadece sağ tarafta ara
j > k → sadece sol tarafta ara
Quicksort iki tarafa da iner; quickselect tek tarafa → N + N/2 + N/4 + … ≈ 2N: ortalama doğrusal zaman!
🎮 Oyunda
Medyan MMR (eşleştirme)
En yakın k düşman (sıralama yok!)
Skor tablosunda ilk 100 (sadece onları sırala)
FPS istatistiği: “%1 low”
Quickselect — kod
C++’ın std::nth_element’i tam olarak budur. Özyineleme yok: tek tarafa indiğimiz için basit bir while yeter.
🎮 “%1 low FPS”: oyuncunun hissettiği takılmalar
Quiz 3 · seçim
1 milyon oyuncunun puanları arasından medyanı bulmak istiyoruz. Hangisi daha hızlı?
Sıralama ~20 milyon karşılaştırma (N lg N), quickselect ortalama birkaç milyon (doğrusal). İkili arama sıralı dizi ister — yani önce sıralamak gerekir. Sadece “k. eleman” lazımsa her şeyi sıralamak boşa iş (sıralama sunumundaki “en yakın düşman” dersi!).
LEVEL 6
Oyunda Bölümleme
tek geçişte: canlılar başa, ölüler sona
bölümleme
quicksort
analiz
iyileştirmeler
tekrar eden anahtarlar
seçim (quickselect)
oyunda bölümleme
sistem sıralamaları
🎮 Bölümleme tek başına da çok işe yarar
Canlıları başa topla — kod
LEVEL 7
Sistem Sıralamaları
hazır Sort() içeride ne kullanıyor?
bölümleme
quicksort
analiz
iyileştirmeler
tekrar eden anahtarlar
seçim (quickselect)
oyunda bölümleme
sistem sıralamaları
Kütüphaneler hangi algoritmayı kullanıyor?
dil / fonksiyon
algoritma
kararlı?
not
C# Array.Sort, List.Sort
introsort (quicksort + heapsort + insertion)
✘
en kötü N lg N garantili
C# LINQ OrderBy
kararlı sıralama
✔
yeni koleksiyon üretir
Python sorted, list.sort
Timsort (mergesort + insertion)
✔
neredeyse sıralıda çok hızlı
JavaScript Array.sort
Timsort (V8)
✔
ES2019’dan beri kararlı
C++ std::sort / stable_sort
introsort / mergesort
✘ / ✔
Unreal Engine C++
Java (sayılar / nesneler)
çift pivotlu quicksort / Timsort
✘ / ✔
Android
Neden nesneler için kararlı (merge tabanlı), sayılar için quicksort? Sayılarda kararlılığın anlamı yok (eşit sayılar ayırt edilemez) → daha hızlı ve ek bellek istemeyen quicksort seçilir.
Hangi sıralama ne zaman? 📋
algoritma
yerinde
kararlı
en kötü
ortalama
en iyi
not
selection
✔
✘
N²/2
N²/2
N²/2
en az takas (N)
insertion
✔
✔
N²/2
N²/4
N
küçük / neredeyse sıralı
shellsort
✔
✘
N3/2?
?
N
kısa kod
mergesort
✘
✔
N lg N
N lg N
½N lg N
garanti, kararlı
quicksort
✔
✘
N²/2
1,39 N lg N
N lg N
pratikte en hızlı
3 yollu quick
✔
✘
N²/2
< N lg N
N
tekrar eden anahtarlar
heapsort
✔
✘
2 N lg N
2 N lg N
N lg N
→ öncelik kuyrukları dersi
🏁 Yarış: shellsort, mergesort, quicksort, 3 yollu
🧪 Kod laboratuvarı: partition yaz
İpucu:while (a[++i] < v) if (i === hi) break; · while (v < a[--j]) if (j === lo) break; · if (i >= j) break; · takas. Bonus: daha basit “Lomuto” bölümlemesini araştırıp yazın (tek işaretçi).
🐍 Kod laboratuvarı — Python
Bu kod çoğu zaman çalışır ama bazı testlerde IndexError verir. Neden? (İpucu: pivot dizinin en büyük elemanıysa i nereye kadar gider?) İki sınır kontrolünü ekle.
Derin hikâye: Tony Hoare (1934–2026) ve altı penilik iddia
1959–60: genç Tony Hoare, Moskova Devlet Üniversitesi’nde makine çevirisi üzerinde çalışıyordu; Rusça kelimeleri sözlükte aramak için önce sıralamak gerekiyordu. Quicksort fikri o zaman doğdu.
İngiltere’ye dönüp Elliott Brothers’ta çalışmaya başladığında kendisinden Shellsort’u kodlaması istendi. Hoare daha hızlı bir yöntem bildiğini söyledi; patronu buna altı penine iddiaya girdi. Hoare iddiayı kazandı.
Algoritmayı 1961’de yayımladı; özyinelemeyi rahatça ifade edebilen ALGOL 60 sayesinde anlatması kolaylaştı. 1980’de Turing Ödülü’nü aldı. 5 Mart 2026’da, 92 yaşında hayatını kaybetti.
Sonrası: Doug McIlroy 1999’da “A Killer Adversary for Quicksort” makalesinde, karşılaştırmaları izleyip girdiyi anında uyduran bir “düşman”ın neredeyse her quicksort’u (rastgele pivot seçenleri bile) karesel süreye sokabildiğini gösterdi. Bugünkü kütüphaneler bu yüzden introsort (derinlik sınırı aşılınca heapsort’a geç) ya da pdqsort kullanır.
DersOrtalama durumda en hızlı algoritma, en kötü durumda en tehlikeli olabilir. Saldırgan girdi (sunucuya gönderilen veri, oyuncuların hazırladığı haritalar) varsa en kötü durum gerçek bir risktir: korumayı (rastgelelik, derinlik sınırı) bilerek eklemek gerekir.
Neredeyse hiçbir zaman: üretimde standart kütüphaneyi kullanın; yıllarca ayarlanmış ve korunmuştur.
Bölümleme fikri ise her yerde: “en yakın k düşman” için quickselect (bütün listeyi sıralamadan), “önce aktifler, sonra pasifler” diye yerinde ayırma.
Eşit anahtar çoksa (ör. aynı katmandaki 10.000 sprite) 3-yollu bölümleme.
Kendiniz yazarsanız: rastgele pivot (ya da üçün ortancası), küçük parçalarda ekleme sıralaması, derinlik sınırı.
Özyineleme derinliğiKötü pivotlarla özyineleme derinliği N’ye ulaşır: büyük dizide yığın taşması. Daha kısa parçaya özyineleme, uzun parçaya döngü uygulamak derinliği log N ile sınırlar.
🤖 Bu konuyu bir YZ kod asistanıyla yazarken
Sık yapılan hatalar — kontrol edin
İlk elemanı pivot almak (sıralı girdide O(n²))
Her çağrıda new Random() oluşturmak
Özyineleme derinliğini sınırlamamak
Çok eşit anahtarda 2-yollu bölümleme
İyi bir istek (prompt) örneği
“C# (.NET 8). En yakın k düşmanı bulmak için quickselect yaz: girdi (konumlar dizisi, oyuncu konumu, k), mesafenin karesiyle karşılaştır, tohumlu Random ile pivot seç, en kötü durumda derinlik sınırı aşılınca heap tabanlı seçime geç. NUnit testleri: k = 0, k = n, tekrarlı mesafeler, sıralı girdi; sonuçları tam sıralamayla karşılaştır.”
Pivot stratejisini ve derinlik sınırını açıkça isteyin
Sıralı, ters sıralı, hep-eşit girdilerle test isteyin
Tohumlu rastgele üreteç isteyin
Top-k için quickselect ya da yığın sorun
🚀 Proje ve araştırma önerileri
[kolay]Quickselect ile en yakın k — Unity’de 1.000 düşman arasından en yakın 5’ini her kare quickselect ile bulun; tam sıralamayla ölçün.
[orta]Düşman girdi — McIlroy’un fikrini kendi basit quicksort’unuza uygulayın: karşılaştırma sayısının nasıl karesel büyüdüğünü gösterin.
[orta]3-yollu bölümleme görselleştirmesi — Hollanda bayrağı problemini p5.js’te animasyonla gösterin.
[araştırma]Hibritler — Kendi introsort’unuzu yazıp Array.Sort ile ölçün; eşik değerlerinin etkisini inceleyin.
📄 Akademik okumalar ve kaynaklar
Hoare 1962 · Quicksort(The Computer Journal 5(1)) Algoritmanın tam anlatımı.