⚡ 7.6: Quick Sort (Hızlı Sıralama)

Pratikte En Hızlı Genel Amaçlı Sıralama

📌 Quick Sort Nedir?

Quick Sort, bir "pivot" eleman seçip diziyi pivot etrafında bölümlere ayıran, sonra bu bölümleri recursive olarak sıralayan algoritma. Pratikte en hızlı sıralama algoritmasıdır.

🎯 Temel Fikir: Partition (Bölümleme)

  1. Bir pivot eleman seç
  2. Pivottan küçük elemanları sola topla
  3. Pivottan büyük elemanları sağa topla
  4. Pivot artık doğru yerinde! 🎯
  5. Sol ve sağ parçaları recursive sırala

🔄 Partition (Bölümleme) Adımları

Örnek: [8, 3, 7, 4, 2, 6, 5] - Pivot: 5 (son eleman)

1
Başlangıç:
8
3
7
4
2
6
5
2
Küçükleri sola, büyükleri sağa:
3
4
2
5
8
7
6

Pivot (5) artık doğru yerinde! Solunda hepsi küçük, sağında hepsi büyük.

3
Sol ve sağ parçaları recursive sırala:
2
3
4
5
6
7
8

📊 Karmaşıklık Analizi

Durum Zaman Açıklama
En İyi O(n log n) Pivot her zaman medyan
Ortalama O(n log n) Rastgele pivot iyi çalışır
En Kötü O(n²) Pivot her zaman en küçük/büyük
Alan O(log n) Call stack (in-place)

⚠️ En Kötü Durum: O(n²)

Ne zaman olur?

  • Dizi zaten sıralıysa ve son elemanı pivot seçersek
  • Dizi ters sıralıysa ve son elemanı pivot seçersek
  • Tüm elemanlar aynıysa

Çözüm: Rastgele pivot seçimi veya "median-of-three" kullanmak!

💻 Python Implementasyonu

1. Temel Versiyon (Lomuto Partition)

Python Kodu
def quick_sort(arr, low=0, high=None, depth=0):
    """
    Quick Sort - Lomuto Partition Scheme
    """
    if high is None:
        high = len(arr) - 1

    indent = "  " * depth

    if low < high:
        print(f"{indent}quick_sort(arr[{low}:{high+1}] = {arr[low:high+1]})")

        # Partition ve pivot indeksini al
        pivot_idx = partition(arr, low, high)
        print(f"{indent}  Pivot {arr[pivot_idx]} indeks {pivot_idx}'e yerleşti")
        print(f"{indent}  Dizi: {arr}")

        # Sol ve sağ parçaları recursive sırala
        quick_sort(arr, low, pivot_idx - 1, depth + 1)
        quick_sort(arr, pivot_idx + 1, high, depth + 1)

    return arr

def partition(arr, low, high):
    """
    Lomuto Partition:
    Son elemanı pivot seç, küçükleri sola topla
    """
    pivot = arr[high]  # Son eleman pivot
    i = low - 1        # Küçük elemanların sınırı

    for j in range(low, high):
        if arr[j] <= pivot:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]

    # Pivotu doğru yerine koy
    arr[i + 1], arr[high] = arr[high], arr[i + 1]

    return i + 1  # Pivot'un yeni indeksi

# Test
dizi = [8, 3, 7, 4, 2, 6, 5]
print(f"Başlangıç: {dizi}\n")

sonuc = quick_sort(dizi.copy())
print(f"\n{'='*40}")
print(f"Sonuç: {sonuc}")
Çıktı bekleniyor...

2. Pythonic Versiyon (Basit ama O(n) alan)

Python Kodu
def quick_sort_simple(arr):
    """
    Basit Quick Sort (List Comprehension ile)

    NOT: Bu versiyon O(n) ek alan kullanır!
    Anlaması kolay ama bellek açısından verimsiz.
    """
    if len(arr) <= 1:
        return arr

    pivot = arr[len(arr) // 2]  # Ortadaki eleman pivot

    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]

    return quick_sort_simple(left) + middle + quick_sort_simple(right)

# Test
dizi = [8, 3, 7, 4, 2, 6, 5, 1, 9]
print(f"Başlangıç: {dizi}")

sonuc = quick_sort_simple(dizi)
print(f"Sonuç: {sonuc}")

# Karşılaştırma
print("\n--- Bu versiyonun artıları/eksileri ---")
print("✅ Çok okunabilir ve anlaşılır")
print("✅ Stabil (eşit elemanlar middle'da)")
print("❌ O(n) ek bellek kullanır")
print("❌ Gerçek Quick Sort in-place çalışır")
Çıktı bekleniyor...

🎯 Pivot Seçim Stratejileri

Strateji Açıklama Risk
İlk/Son Eleman En basit yöntem Sıralı dizide O(n²)
Rastgele Rastgele eleman seç Ortalamada iyi
Median-of-Three İlk, orta, son'un medyanı En güvenli

🆚 Quick Sort vs Merge Sort

Özellik Quick Sort Merge Sort
Ortalama O(n log n) O(n log n)
En Kötü O(n²) O(n log n)
Alan O(log n) O(n)
Stabil ❌ Hayır ✅ Evet
Cache ✅ Friendly ❌ Unfriendly
Pratikte Genellikle daha hızlı! Garantili performans

🌍 Kullanım Alanları