Merge Sort Algoritması
Merge Sort Açıklaması
Merge Sort, "Böl ve Fethet" (Divide and Conquer) paradigmasını kullanan verimli ve kararlı bir sıralama algoritmasıdır. Diziyi önce küçük alt parçalara böler, ardından bu parçaları sıralayarak birleştirir. ## Çalışma Prensibi: 1. **Bölme (Divide)**: Diziyi yaklaşık olarak iki eşit parçaya böl. 2. **Fethetme (Conquer)**: Alt dizileri özyinelemeli olarak sırala. 3. **Birleştirme (Merge)**: Sıralanmış alt dizileri birleştirerek tek bir sıralı dizi oluştur. ## Önemli Özellikler: 1. **Kararlı Sıralama**: Eşit değere sahip elemanların göreceli sırası korunur. 2. **Tutarlı Performans**: Her durumda O(n log n) zaman karmaşıklığı garantisi sunar. 3. **Ekstra Bellek**: Sıralama için ek bellek gerektirir (O(n) alan karmaşıklığı). 4. **Dış Sıralama**: Büyük veri setleri için dış sıralama (external sorting) uygulamaları için uygundur. Merge Sort, büyük veri setleri için ve kararlılığın önemli olduğu durumlarda tercih edilen bir algoritmadır. Tutarlı performansı ve kararlılığı nedeniyle, birçok programlama dilinin standart kütüphanelerinde kullanılır.
Kod Örnekleri
Merge Sort algoritmasının farklı programlama dillerindeki uygulamaları aşağıda verilmiştir. Her örnek, algoritmanın optimize edilmiş versiyonunu içerir ve detaylı açıklamalarla sunulmuştur.
1/**2 * Merge Sort implementation for JavaScript arrays3 * @param {Array} arr - The array to sort4 * @returns {Array} - A new sorted array5 */6function mergeSort(arr) {7 // Base case: arrays with 0 or 1 element are already sorted8 if (arr.length <= 1) return arr;9 10 // Split array into two halves11 const mid = Math.floor(arr.length / 2);12 const left = arr.slice(0, mid);13 const right = arr.slice(mid);14 15 // Recursively sort both halves16 const sortedLeft = mergeSort(left);17 const sortedRight = mergeSort(right);18 19 // Merge the sorted halves20 return merge(sortedLeft, sortedRight);21}2223/**24 * Merge two sorted arrays into one sorted array25 * @param {Array} left - First sorted array26 * @param {Array} right - Second sorted array27 * @returns {Array} - Merged sorted array28 */29function merge(left, right) {30 let result = [];31 let leftIndex = 0;32 let rightIndex = 0;33 34 // Compare elements from both arrays and add the smaller one to the result35 while (leftIndex < left.length && rightIndex < right.length) {36 if (left[leftIndex] < right[rightIndex]) {37 result.push(left[leftIndex]);38 leftIndex++;39 } else {40 result.push(right[rightIndex]);41 rightIndex++;42 }43 }44 45 // Add any remaining elements from both arrays46 return result.concat(left.slice(leftIndex), right.slice(rightIndex));47}
Kendi Verilerinizle Test Edin
Aşağıya kendi verilerinizi girerek Merge Sort algoritmasını test edebilirsiniz. Virgülle ayrılmış sayılar girin (örn: 5,3,8,4,2) veya rastgele bir dizi oluşturun.
Merge Sort Demo
Verdiğiniz dizi Merge Sort algoritması ile sıralanacaktır.
Not: Merge Sort her durumda O(n log n) karmaşıklığa sahiptir, bu da büyük veri setleri için tutarlı performans sağlar.
Algoritma Analizi
Zaman ve Alan Karmaşıklığı
Zaman Karmaşıklığı
- En İyi Durum:
O(n log n)
- Dizi zaten sıralı olsa bile, bölme ve birleştirme işlemleri yapılması gerekir. - Ortalama Durum:
O(n log n)
- Her düzeyde n karşılaştırma yapılır ve log n düzey vardır. - En Kötü Durum:
O(n log n)
- Bölme ve birleştirme işlemleri dizinin düzeninden bağımsızdır.
Alan Karmaşıklığı
O(n)
- Birleştirme işlemi için geçici bir dizi kullanıldığından, orijinal dizi boyutunda ekstra bellek kullanır.
Kararlılık (Stability)
Merge Sort kararlı bir algoritmadır. Birleştirme işleminde, eşit elemanlar karşılaştırıldığında, sol dizideki eleman önce alınarak, orijinal sıranın korunması sağlanır.
Avantajlar ve Dezavantajlar
Avantajlar
- Her durumda O(n log n) karmaşıklık garantisi sunar.
- Kararlı bir algoritma olduğundan, eşit değerli elemanların sırası korunur.
- Bağlı listeler gibi ardışıl erişimli veri yapıları için idealdir.
- Dizinin düzeninden bağımsız olarak tutarlı performans gösterir.
- Dış sıralama (external sorting) uygulamaları için uygundur.
- Paralelleştirmeye uygun bir algoritma yapısına sahiptir.
Dezavantajlar
- O(n) ekstra bellek gerektirir (yerinde sıralama yapmaz).
- Küçük diziler için Quick Sort veya Insertion Sort'tan daha yavaş olabilir.
- Her adımda yeni diziler oluşturma ve kopyalama işlemleri performansı etkileyebilir.
- Birleştirme adımında dizinin tamamını taramak gerekir.
Merge Sort Nasıl Çalışır?
Aşağıda, Merge Sort'un [38, 27, 43, 3, 9, 82, 10] dizisini sıralama adımları gösterilmiştir:
Adım Adım Merge Sort
Başlangıç Dizisi:
[38, 27, 43, 3, 9, 82, 10]
1. Bölme Adımı:
Diziyi ortadan ikiye böleriz:
[38, 27, 43, 3] ve [9, 82, 10]
2. Bölme Adımı:
Alt dizileri tekrar böleriz:
[38, 27] ve [43, 3] ve [9, 82] ve [10]
3. Bölme Adımı:
Alt dizileri tekrar böleriz (bölünebilen diziler için):
[38] ve [27] ve [43] ve [3] ve [9] ve [82] ve [10]
Artık tüm alt diziler 1 veya 0 elemanlı, birleştirmeye başlayabiliriz.
1. Birleştirme Adımı:
1 elemanlı alt dizileri sıralı bir şekilde birleştiririz:
[27, 38] ve [3, 43] ve [9, 82] ve [10]
2. Birleştirme Adımı:
2 elemanlı alt dizileri sıralı bir şekilde birleştiririz:
[3, 27, 38, 43] ve [9, 10, 82]
3. Birleştirme Adımı (Son Adım):
Kalan iki alt diziyi sıralı bir şekilde birleştiririz:
[3, 9, 10, 27, 38, 43, 82]
Sonuç: Tamamen Sıralanmış Dizi
[3, 9, 10, 27, 38, 43, 82]
Merge Sort ve Diğer Algoritmalar
Merge Sort ile diğer popüler sıralama algoritmalarının karşılaştırması:
Özellik | Merge Sort | Quick Sort | Heap Sort | Insertion Sort |
---|---|---|---|---|
En İyi Durum | O(n log n) | O(n log n) | O(n log n) | O(n) |
En Kötü Durum | O(n log n) | O(n²) | O(n log n) | O(n²) |
Alan Karmaşıklığı | O(n) | O(log n) | O(1) | O(1) |
Kararlılık | Kararlı | Kararsız | Kararsız | Kararlı |
Önbellek Dostu | Orta | Yüksek | Düşük | Yüksek |
Uyarlanabilirlik | Uyarlanabilir değil | Kısmen | Uyarlanabilir değil | Yüksek |
Dış Sıralama | İdeal | Uygun değil | Uygun değil | Uygun değil |
Tercih Edilme Durumu | Kararlılık, tutarlı performans gerektiğinde | Genel amaçlı, pratik kullanım | Sınırlı bellek durumlarında | Küçük veya kısmen sıralı dizilerde |
Merge Sort, özellikle kararlılığın önemli olduğu ve her durumda güvenilir performans gerektiren uygulamalar için idealdir. Ancak, ekstra bellek kullanımı nedeniyle, bellek sınırlı sistemlerde Heap Sort veya Quick Sort daha iyi bir seçenek olabilir.
İlgili Algoritmalar
Merge Sort ile ilişkili veya benzer algoritmalar:
Timsort
Merge Sort ve Insertion Sort'u birleştiren hibrit bir algoritma. Python, Java ve diğer birçok dilin yerleşik sıralama algoritması olarak kullanılır.
Natural Merge Sort
Dizideki doğal olarak sıralı alt dizileri (runs) tespit ederek, bölme adımını optimize eden bir Merge Sort varyasyonu.
Polyphase Merge Sort
Dış sıralama için kullanılan bir Merge Sort varyasyonu. Sınırlı sayıda dosya veya teyp kullanarak büyük veri setlerini sıralar.
Merge Sort
Böl ve Fethet stratejisini kullanan, kararlı ve tutarlı bir sıralama algoritması.
Avantajlar
- Her durumda O(n log n) zaman karmaşıklığı garantisi
- Kararlı bir sıralama algoritması
- Bağlı listeler gibi ardışıl erişimli veri yapıları için idealdir
- Paralelleştirmeye uygun bir algoritma yapısı
- Dış sıralama (external sorting) uygulamaları için idealdir
Dezavantajlar
- O(n) ekstra bellek gerektirir (yerinde sıralama yapmaz)
- Küçük diziler için Quick Sort veya Insertion Sort'tan daha yavaş olabilir
- Her adımda yeni diziler oluşturma ve kopyalama işlemleri gerekir
- Önbellek verimliliği, ardışıl olmayan bellek erişimleri nedeniyle düşük olabilir