Merge (Bireşim) Her biri kendi içinde artan yönde sıralanmış ve aynı veri tipinden olan a ve b dizileri (array) verilsin. Bu iki diziyi birleştirip sıralı bir dizi yapmak istiyoruz. Tabii, birisini ötekinin sonuna ekleyip, sonra bireşen diziyi sıralamayı düşünebiliriz. Ama bireşme işlemi yapılırken sıralamanın da yapılması zaman kazandıracak ve algoritmayı daha etkin kılacaktır. Bu yöntem, ayrıca, iyi bir sıralama yöntemi olacaktır. Algoritmayı önce bir örnek üzerinde açıklayalım. int [] a = {2, 4, 5, 8 ; int [] b = {1, 3, 7, 9, 15, 24; dizileri verilsin. a ve b nin öğelerini bir c dizisine sıralı olarak taşıyacağız. Bu taşımanın yapılabilmesi için c nin öğe sayısının a ile b nin öğeleri toplamından az olmaması gerektiği açıktır. Örnerğimizde a nın öğe sayısı 4, b nin öğe sayısı 6 olduğuna göre, int tipinden olan ve öğe sayısı enaz 4 + 6 = 10 olan bir dizi bildirimi yapmalıyız. a,b,c dizilerini aşağıdaki gibi gösterelim ve yapılacak işlemleri adım adım izleyelim. c Algoritmanın Adımları: 1. a ile b nin ilk öğelerini mukayese edecek ve küçük olanı c[0] yerine yazacağız. Bu işlem c[0 = 1 olması demektir. b dizisinden c dizisine taşınan 1 öğesini b dizisinden atalım. 2. a ve b dizisinden giden öğeler kırmızı ile, c dizisine taşınmış öğeler ise mavi ile gösterilmiştir. c 1 3. a dizisinin ilk öğesi ile b dizisinde taşınmadan geri kalan altdizinin ilk öğesini mukayese edip, küçük olanı c[1] yerine taşıyoruz. Bu işlem sonunda c[1] = 2 olur ve a nın ilk terimi atılır. c 1 2 4. a dizisinde taşınmadan geri kalan alt dizinin ilk öğesi ile b dizisinde taşınmadan geri kalan altdizinin ilk öğesini mukayese edip, küçük olanı c[2] yerine taşıyoruz. Bu işlem sonunda c[2] = 3 olur ve b nin ikinci terimi atılır. c 1 2 3 1
5. a ya da b dizisinden birisinin terimleri bitene kadar bu algoritmayı uygulayacağız. Bu demektir ki, a dizisinde taşınmadan geri kalan alt dizinin ilk öğesi ile b dizisinde taşınmadan geri kalan altdizinin ilk öğesini mukayese edip, küçük olanı c dizisinde ilk boş yere taşıyacağız. Bu işlemlerin sonunda şeklimiz şöyle olur: c 1 2 3 4 5 7 8 6. a dizisinde taşınacak öğe kalmadığı için, b nin geri kalan terimlerinin hepsini c ye sırayla taşıyacağız. c 1 2 3 4 5 7 8 9 15 24 Bu söylediklerimizi bir yalancı kod (pseudo code) haline getirelim: a dizisini a[asol...asağ], b dizisini b[bsol...bsağ] ve c dizisini c[csol...csağ] ile gösterelim. Burada xsol ve xsağ bir x dizisinin ilk ve son terimlerinin indislerini gösteriyor olsunlar. a ile b dizilerinin sıralı olduğunu varsayıyoruz. Bu ikisinin terimleri, sıralı olması istenen c dizinine taşınarak bireştirilecektir. 1. i = asol, set j = bsol, and set k = csol. 2. while i < asağ and j < bsağ, repeat: 2.1. if a[i] <= b[j]: 2.1.1. c[k]= a[i] 2.1.2. i++ ve k++. 2.2. değilse, if a[i] >= d2[j]: 2.2.1. b[j] into c[k] = b[j] 2.2.2. 7++ ve k++. 3. while i < asağ, repeat: 3.1. c[k] = a[i]. 3.2. i++ ve k++. 4. while j < bsağ, repeat: 5. Dur. 4.1. b[j] into c[k]= b[j] 4.2. j++ ve k++. 2
Şimdi yukarıdaki pseudo kodları java kodlarına dönüştürerek, iki diziyi bireştiren bir java metodu yazalım: // (a.length + b.length) <= c.length olmalıdır. public void bireştir(int[] a, int[] b, int[] c) { int i, j, k, m, n; i = 0; j = 0; k = 0; m = a.length; n = b.length; while (i < m && j < n) { if (a[i] <= b[j]) { c[k] = a[i]; i++; else { c[k] = b[j]; j++; if (i < m) { for (int p = i; p < m; p++) { c[k] = a[p]; else { for (int p = j; p < n; p++) { c[k] = b[p]; Şimdi merge metodunu içeren bir java uygulama programı yazalım: // package merge; import java.util.arrays; public class Merge01 { int[] a = { 2, 4, 5, 8 ; int[] b = { 1, 3, 7, 9, 15, 24 ; 3
int[] c; public void bireştir(int[] a, int[] b, int[] c) { int i, j, k, m, n; i = 0; j = 0; k = 0; m = a.length; n = b.length; while (i < m && j < n) { if (a[i] <= b[j]) { c[k] = a[i]; i++; else { c[k] = b[j]; j++; if (i < m) { for (int p = i; p < m; p++) { c[k] = a[p]; else { for (int p = j; p < n; p++) { c[k] = b[p]; public static void main(string[] args) { Merge01 m = new Merge01(); m.c = new int[12]; m.bireştir(m.a, m.b, m.c); System.out.println(Arrays.toString(m.a)); System.out.println(Arrays.toString(m.b)); System.out.println(Arrays.toString(m.c)); İstenirse, yukarıdaki java kodları daha kısa yazılabilir: Aşağıdaki metotta Comparable yerine öğeleri sıralanabilen herhangi bir veri tipi alınabilir. Örneğin, int, long, float, String, vb. void bireştir (String[] aaa, int asol, int asağ, String[] bbb, int bsol, int bsağ, String[] ccc, int csol) { // Merge: aaa[asol...asağ ] ile b[bsol...bsağ] dizileri // ccc[csol...] diziinde bireşiyor.(aaa ve bbb sıralıdır). int i = asol, j = bsol, k = csol; while (i <= asağ && j <= bsağ) { int comp = aaa[i].compareto(bbb[j]); if (comp <= 0) 4
else while (i <= asağ) while (j <= bsağ) Bunu kullanan bir java uygulaması yazalım: //package bireşim; import java.util.arrays; public class Merge02 { String[] a = {"kartal", "şahin", "tilki", "fare"; String[] b = {"zebra", "kaplan", "aslan", "güvercin", "kanarya", "at"; String[] c ; void bireştir (String[] aaa, int asol, int asağ, String[] bbb, int bsol, int bsağ, String[] ccc, int csol) { // Merge: aaa[asol...asağ ] ile b[bsol...bsağ] dizileri // ccc[csol...] diziinde bireşiyor.(aaa ve bbb sıralıdır). int i = asol, j = bsol, k = csol; while (i <= asağ && j <= bsağ) { int comp = aaa[i].compareto(bbb[j]); if (comp <= 0) else while (i <= asağ) while (j <= bsağ) public static void main(string[] args) { Merge02 m = new Merge02(); m.c = new String[12]; m.bireştir(m.a,0,3, m.b,0,5, m.c,0); System.out.println(Arrays.toString(m.a)); System.out.println(Arrays.toString(m.b)); System.out.println(Arrays.toString(m.c)); /* Çıktı: [kartal, şahin, tilki, fare] [zebra, kaplan, aslan, güvercin, kanarya, at] [kartal, zebra, kaplan, aslan, güvercin, kanarya, at, şahin, tilki, fare, null, null] */ 5