Sıralama Algoritmaları - 5. Birleştirmeli Sıralama (Merge Sort)
Girdi olarak aldığı diziyi en küçük hale gelene kadar ikili gruplara böler ve karşılaştırma yöntemi kullanarak diziyi sıralar.
| İngilizce Adı | Merge Sort |
| Ortalama | O(n log n) |
| En kötü | O(n log n) |
| Bellek | O(n) |
| Kararlı mı? | Evet |
| Yöntem | Karşılaştırma ile Birleştirme |
Girdi olarak aldığı diziyi en küçük hale gelene kadar ikili gruplara böler ve karşılaştırma yöntemi kullanarak diziyi sıralar.
Algoritmanın çalışması kavramsal olarak şöyledir:
- Sıralı olmayan listeyi ortadan eşit olarak iki alt listeye ayırır.
- Alt listeleri kendi içinde sıralar.
- Sıralı iki alt listeyi tek bir sıralı liste olacak şekilde birleştirir.
Bu algoritma John von Neumann tarafından 1945 yılında bulunmuştur.
Kod örneği
public class BirlestirmeliSiralama
{
int[] dizi;
private int[] a, b;
public int[] Dizi
{
get { return dizi; }
set { dizi = (int[])value.Clone(); }
}
public BirlestirmeliSiralama()
{
}
public void Sirala()
{
a = Dizi;
int n = a.Length;
// according to variant either/or:
b = new int[n];
//b = new int[(n + 1) / 2];
Sort(0, Dizi.Length - 1);
}
public override string ToString()
{
return "Birleştirmeli Sıralama";
}
void Sort(int lo, int hi)
{
if (lo < hi)
{
int m = (lo + hi) / 2;
Sort(lo, m);
Sort(m + 1, hi);
Merge(lo, m, hi);
}
}
void Merge(int lo, int m, int hi)
{
int i = lo, j = hi, k = lo;
// copy first half of array a to auxiliary array b
while (i <= m)
b[k++] = a[i++];
// copy second half of array a to auxiliary array b,
// but in opposite order
while (j > m)
b[k++] = a[j--];
i = lo; j = hi; k = lo;
// copy back next-greatest element at each time
// until i and j cross
while (i <= j)
if (b[i] <= b[j])
a[k++] = b[i++];
else
a[k++] = b[j--];
}
}
#sıralama-algoritmaları #sorthing-algorithms #birleştirmeli-sıralama #merge-sort