Menu
Coddy logo textTech

Quick Sort

Son güncelleme

Quicksort, bir "pivot" etrafında sıralayan bir böl ve yönet algoritmasıdır. Bir pivot eleman seçer, ardından diziyi öyle bölümler ki tüm küçük değerler önce, tüm büyük değerler sonra gelir - bu da pivotu nihai sıralı konumuna kilitler. Sonra sol ve sağ bölümler üzerinde özyineleme yapar. Bu görselleştirme, son elemanı pivot olarak kullanan Lomuto şemasını kullanır. Bölümlemeyi ve pivot yerleşimini izlemek için oynat'a basın.

Quicksort, iyi önbellek davranışı ve yerinde bölümleme sayesinde pratikte genellikle en hızlı genel amaçlı sıralamadır ve ortalaması O(n log n)'dir. En kötü durumu O(n²)'dir (örneğin kötü bir pivot seçimiyle zaten sıralı bir dizi); üç-medyan veya rastgeleleştirme gibi iyi pivot stratejileri bunu önler.

Zaman ve alan karmaşıklığı

DurumKarmaşıklıkNotlar
En iyi durumO(n log n)Dengeli bölümler
Ortalama durumO(n log n)Rastgele sıra
En kötü durumO(n²)Sürekli dengesiz pivotlar
AlanO(log n)Özyineleme yığını (yerinde bölümleme)
KararlıHayırBölümleme takasları eşit elemanları yeniden sıralar

Adım adım

AdımNe olur
1Bir pivot seçin (burada, aralığın son elemanı).
2Bölümleme: pivottan küçük tüm elemanları soluna taşıyın.
3Pivotu sınıra takas edin - artık nihai konumundadır.
4Sol bölüme özyinelemeli olarak quicksort uygulayın.
5Sağ bölüme özyinelemeli olarak quicksort uygulayın.

Çözümlü örnek

[5, 2, 4, 1] dizisini Lomuto şemasıyla (son eleman pivot) sıralama:

GeçişDiziİşlem
Başlangıç[5, 2, 4, 1]Tüm aralığı bölümle; pivot 1 (son eleman).
1[1, 2, 4, 5]1'den küçük hiçbir şey yok, bu yüzden 1'i 0 indisine takas edin; pivot 1 artık nihaidir. [2, 4, 5] üzerinde sağa özyinele.
2[1, 2, 4, 5][2, 4, 5]'i pivot 5 ile bölümle; hem 2 hem 4 daha küçük, bu yüzden 5 sonda kalır ve nihaidir. [2, 4] üzerinde sola özyinele.
3[1, 2, 4, 5][2, 4]'ü pivot 4 ile bölümle; 2 daha küçük, bu yüzden 4 yerinde kalır ve nihaidir. 2 tek bir elemandır, bu yüzden zaten sıralıdır.
Bitti[1, 2, 4, 5]Her pivot yerine kilitlenir; dizi sıralanmıştır.

Quicksort ne zaman kullanılır

Şu durumda kullanınŞu durumda kaçının
Küçük sabit çarpanlı, hızlı ve genel amaçlı bir bellek içi sıralamaya ihtiyacınız olduğunda.Garantili O(n log n) en kötü durum süresine ihtiyacınız olduğunda (heap sort veya merge sort kullanın).
Bellek kısıtlıysa - bölümleme yerinde yapılır ve yalnızca O(log n) yığın alanı gerektirir.Eşit anahtarların sırasını koruyan kararlı bir sıralamaya ihtiyacınız olduğunda.
Veri rastgele veya bilinmeyen sırada ise ve rastgele ya da üç-medyan pivot kullanıyorsanız.Girdi zaten sıralı veya neredeyse sıralıysa ve pivot sabitse, O(n²)'yi tetikler.
İyi önbellek yerelliği önemliyse, çünkü quicksort belleğe sıralı erişir.Bağlı liste sıralıyorsanız; burada merge sort, quicksort'un dayandığı rastgele erişimden kaçınır.

Quick Sort kodu

Python, JavaScript, Java, C++, C dillerinde temiz ve çalıştırılabilir bir Quick Sort uygulaması. Bir dil seçin, kodu kopyalayın veya Coddy Playground'da hazır yüklenmiş olarak açın.

Python ile Quick Sort kodu

Python
1def quick_sort(a, low=0, high=None):2    if high is None:3        high = len(a) - 14    if low < high:5        p = partition(a, low, high)6        quick_sort(a, low, p - 1)7        quick_sort(a, p + 1, high)8    return a9
10
11def partition(a, low, high):12    # Lomuto partition: everything < pivot moves left of it13    pivot = a[high]14    i = low15    for j in range(low, high):16        if a[j] < pivot:17            a[i], a[j] = a[j], a[i]18            i += 119    a[i], a[high] = a[high], a[i]20    return i21
22
23nums = [10, 7, 8, 9, 1, 5]24print("Before:", nums)25quick_sort(nums)26print("After: ", nums)
Bu kodu Python Playground'da çalıştır

Quick Sort SSS

Quicksort'un zaman karmaşıklığı nedir?
Quicksort ortalama O(n log n)'dir ve en iyi durumda O(n log n)'dir, ancak bölümler sürekli dengesiz olduğunda en kötü durumda O(n²)'ye düşer. Rastgele veya üç-medyan pivotlar en kötü durumu çok olası kılmaz.
Quicksort kararlı mı?
Hayır. Standart yerinde bölümleme uzak elemanları takas eder ve bu, eşit anahtarların göreli sırasını değiştirebilir. Kararlı varyantlar vardır ancak quicksort'un yerinde çalışma avantajından vazgeçerler.
Quicksort neden genellikle merge sort'tan daha hızlıdır?
Quicksort mükemmel önbellek yerelliğiyle ve ek tampon olmadan yerinde bölümler, bu yüzden sabitleri küçüktür. Merge sort onun O(n log n) sınırına eşit olur ancak O(n) tampon ve daha fazla veri hareketi için bedel öder.
Quicksort mu merge sort mu - hangisini kullanmalıyım?
Bellekteki dizileri hızlı ve yerinde sıralamak için quicksort'u seçin; küçük sabitleri genellikle kazanır. Kararlı bir sıralama, garantili O(n log n) en kötü durum ya da RAM'e sığmayan bağlı liste veya harici veri sıralaması gerektiğinde merge sort'u seçin.
Quicksort sıralı bir dizide neden O(n²) olur?
İlk veya son eleman gibi sabit bir pivotla, zaten sıralı bir girdi her bölümün yalnızca bir elemanı ayırmasına neden olur ve log n yerine n özyineleme seviyesi üretir. Pivotu rastgele veya üç-medyan ile seçmek bu deseni kırar ve O(n log n) davranışını geri getirir.
Lomuto ve Hoare bölümleme şemaları arasındaki fark nedir?
Lomuto şeması soldan sağa tarayan tek bir indis kullanır ve kodlaması daha basittir, bu yüzden bu görselleştirme onu kullanır. Hoare şeması içe doğru hareket eden iki işaretçi kullanır ve genellikle daha az takas yapar, pratikte daha hızlıdır, ancak bölümleme adımında pivotu nihai konumuna yerleştirmez.
Coddy programming languages illustration

Coddy ile algoritmalarda ustalaş

BAŞLA