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.

Merge Sort - JavaScript
1/**
2 * Merge Sort implementation for JavaScript arrays
3 * @param {Array} arr - The array to sort
4 * @returns {Array} - A new sorted array
5 */
6function mergeSort(arr) {
7 // Base case: arrays with 0 or 1 element are already sorted
8 if (arr.length <= 1) return arr;
9
10 // Split array into two halves
11 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 halves
16 const sortedLeft = mergeSort(left);
17 const sortedRight = mergeSort(right);
18
19 // Merge the sorted halves
20 return merge(sortedLeft, sortedRight);
21}
22
23/**
24 * Merge two sorted arrays into one sorted array
25 * @param {Array} left - First sorted array
26 * @param {Array} right - Second sorted array
27 * @returns {Array} - Merged sorted array
28 */
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 result
35 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 arrays
46 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.

Sıralanmış Dizi: null

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ı:

ÖzellikMerge SortQuick SortHeap SortInsertion Sort
En İyi DurumO(n log n)O(n log n)O(n log n)O(n)
En Kötü DurumO(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ıkKararlıKararsızKararsızKararlı
Önbellek DostuOrtaYüksekDüşükYüksek
UyarlanabilirlikUyarlanabilir değilKısmenUyarlanabilir değilYüksek
Dış SıralamaİdealUygun değilUygun değilUygun değil
Tercih Edilme DurumuKararlılık, tutarlı performans gerektiğindeGenel amaçlı, pratik kullanımSınırlı bellek durumlarındaKüçü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