COMPUTER ENGINEER

← BlogDATA STRUCTURES / ALGORITHMSPython örnek paketi ↓

Arama ve sıralama · 15 / 53

Quicksort, quickselect ve pivot seçimi

Anla → iz sür → uygula → gerekçelendir

1 dk okuma · uygulama için ayrıca zaman ayır

Partition, pivot'a göre öğeleri bölümlere ayırır; pivot seçimi ile partition kuralı ayrı kararlardır. Rastgele pivot adversarial sıralılığa bağımlılığı azaltır ama worst-case garantisini ortadan kaldırmaz. Üç yönlü partition küçük/eşit/büyük grupları ayırarak çok tekrar içeren veride gereksiz recursion'ı önler.

Quicksort her iki tarafı sıralar. Quickselect yalnız k'ın bulunduğu tarafa gider; beklenen doğrusal seçim sağlar. k'ın sıfırdan mı birden mi sayıldığını tanımla. Median-of-medians uygun uygulanırsa worst-case O(n) seçim elde eder, fakat sabit maliyeti yüksektir.

Introsort derinlik sınırına ulaştığında heapsort'a dönerek worst-case O(n log n) sağlar. Timsort başka bir hibrit olup mevcut run'ları kullanır; Python'un sort fonksiyonunu burada yazdığımız quicksort sanma. Aşağıdaki okunaklı üç-listeli örnek in-place değildir; benchmark'ta allocation maliyetini saklama.

Adım adım iz sürme

[3,1,3,2], pivot3 → küçük[1,2], eşit[3,3], büyük[]. Eşit bölüm yeniden sıralanmaz.

Maliyet ve varsayımlar

Rastgele quicksort beklenen O(n log n), worst O(n²). Quickselect beklenen O(n). Örnek partition başına O(n) alan ayırır.

Çalıştırılabilir örnek

Python 3 ile çalıştır. Assert küçük bir örneği denetler; genel doğruluk ispatı değildir. Bazı ileri örnekler özellikle küçük model veya referans oracle'dır; tam üretim uygulaması değildir.

Python 3
from random import choice

def quicksort(a):
    if len(a) < 2: return list(a)
    p = choice(a)
    return (quicksort([x for x in a if x < p]) +
            [x for x in a if x == p] +
            quicksort([x for x in a if x > p]))
assert quicksort([3,1,3,2]) == [1,2,3,3]

KAVRADIĞINI KONTROL ET

Sıra sende

En küçük pivot her tur seçilirse recurrence nedir?

Çözümün mantığını göster

T(n)=T(n−1)+Θ(n), dolayısıyla Θ(n²). Rastgelelik bu bölünmenin beklentide sürmesini engeller, imkânsız yapmaz.

Bir adım ileri

  1. Örneği değiştirmeden önce girdi sözleşmesini ve invariantı yaz.
  2. Uygun olan boş, sınır, tekrar ve adversarial girdileri ekle. Basit bir oracle ile karşılaştır.
  3. Belirtilen modelde maliyeti çıkar; farklı girdi büyüklüklerini ölç ve farkları gerekçelendir.

Temel kaynaklar ve ders notları

Bu eğitimde özgün anlatım kullanıldı; aşağıdaki kaynaklar ispatlar ve ileri okumalar sunar. Bağlantılar daha geniş ders modülünü kapsayabilir.

MIT 6.046J · Design and Analysis ↗Princeton · Algorithms, Sedgewick & Wayne ↗
İlerlemeden önce alıştırmayı çöz.