Yığınlama Sıralaması (Heap Sort)
Verinin hafızada sıralı tutulması için geliştirilen sıralama algoritmalarından (sorting algorithms) bir tanesidir. Yıpınlama sıralaması, arka planda bir yığın ağacı(heap) oluşturur ve bu ağacın en üstündeki sayıyı alarak sıralama işlemi yapar. Sıralanmak istenen verimiz: ‘5,12,20,18,4,3 ‘olsun. Bu verilerin bir oluşumun belirleyici alanları olduğunu düşünebiliriz. Yani örneğin vatandaşlık numarası veya öğrenci numarası gibi. Dolayısıyla örneğin öğrencilerin numaralarına göre sıralanması durumunda kullanılabilir.
Bu sayılardan bir yığın ağacı oluşturulduğunda aşağıdaki şekilde bir sonuç elde edilir: Bu ağacın en büyük değeri en üstte (kökte) durmaktadır öyleyse bu değer alınarak sonuç dizisinin son elemanı yapılırsa ve sonra geriye kalan sayılar tekrar yığınlanırsa (heapify) ve bu işlem eleman kalmayana kadar tekrarlanırsa sonuç dizisindeki veriler sıralanmış olarak elde edilir
Bu sayılar ilk başta verilen sayıların sıralanmış hali yani {20,18,12,5,4,3} olacaktır. Şayet sıralama işlemi küçükten büyüğe yapılsın isteniyorsa bu durumda sayılar dizinin başından değil sonundan yazılarak kaydedilebilir veya çıkan sonuç tersten sıralanabilir.
Bu işlemi yapan bir yığın sıralaması (heap sort) kodu java dilinde aşağıdaki şekilde yazılabilir : public void heapsort(int[]A){ int tmp; BuildHeap(A); for(int i = A.length-1; i>=0; i--) { tmp=A[0]; A[0]=A[i]; A[i]=tmp; heapsize = heapsize -1 ; heapify(A,0); } }
Birleştirme Sıralaması (Merge Sort)
Verinin hafızada sıralı tutulması için geliştirilen sıralama algoritmalarından (sorting algorithms) bir tanesidir. Basitçe sıralanacak olan diziyi ikişer elemanı kalan parçalara inene kadar sürekli olarak ikiye böler. Sonra bu parçaları kendi içlerinde sıralayarak birleştirir. Sonuçta elde edilen dizi sıralı dizinin kendisidir. Bu açıdan bir parçala fethet (divide and conquere) yaklaşımıdır.
Sıralanmak istenen verimiz: 5,7,2,9,6,1,3,7 olsun.
1. adım diziyi ikiye böl: 5,7,2,9 ve 6,1,3,7 2. adım çıkan bu dizileri de ikiye böl: 5,7 ; 2,9 ; 6,1 ; 3,7 3. adım elde edilen parçalar 2 veya daha küçük eleman sayısına ulaştığı için dur (aksi durumda bölme işlemi devam edecekti) 4. adım her parçayı kendi içinde sırala 5,7 ; 2,9 ; 1,6 ; 3,7 5. Her bölünmüş parçayı birleştir ve birleştirirken sıraya dikkat ederek birleştir (1. ve 2. parçalar ile 3. ve 4. parçalar aynı gruptan bölünmüştü) 2,5,7,9 ve 1,3,6,7 6. adım, tek bir bütün parça olmadığı için birleştirmeye devam et 1,2,3,5,6,7,7,9 7. adım sonuçta bir bütün birleşmiş parça olduğu için dur. İşte bu sonuç dizisi ilk dizinin sıralanmış halidir.
Birleştirme Sıralamasının JAVA dilinde yazılmış bir örnek kodu aşağıda verilmiştir: Öncelikle birleştirme sıralamasının ana fonksiyonu:
public int [] mergesort(int [] m) { int x=0; int y=0; int middle=m public int [] mergesort(int [] m) { int x=0; int y=0; int middle=m.length/2; int left[] =new int [middle]; int right[] =new int [middle]; int result[] =new int[(m.length)];
if(m.length<= 1){ return m; } for(int i=0; i<middle; i++) { left[x]=m[i]; x++; for(int i=middle; i<m.length; i++) right[y]=m[i]; y++; left=mergesort(left); right=mergesort(right); result=merge(left,right); return result;
Bu fonksiyon dikkat edilirse özyinelemeli (recursive) bir kod olup paramatre olarak aldığı dizinin yanında bu dizi boyutunun yarısı uzunluğunda iki ilave dizi kullanmış ve bu dizilere iki parçayı ayrı ayrı koyarak yine sıralaması için kendi fonksiyonuna parametre olarak geçirmiştir. Sonda ise bu iki parçayı birleştiren bir merge() fonksiyonu çağırmıştır. İşte bu birleştirme fonksiyonunun kodu şudur:
public int [] merge(int []left,int []right) { int result[] =new int [left.length + right.length]; int x=0; int y=0; int k=0; while(left.length>x && right.length>y) { if(left[x] <= right[y]) { result[k]=left[x]; x++; k++;
} else { result[k]=right[y]; y++; k++; if(left } else { result[k]=right[y]; y++; k++; if(left.length>x) while(x < left.length) result[k]=left[x]; x++;
if(right. length>y) { while(y < right if(right.length>y) { while(y < right.length) result[k]=right[y]; y++; k++; } return result;
Koda dikkat edilecek olursa 3 ayrı durum için birleştirme kodu yazılmıştır: Birinci durumda iki dizide de eleman bulunmaktadır. Bu durumda iki dizideki en baştaki sayılar karşılaştırılarak küçük olan sonuç dizisine kopyalanmaktadır. İkinci ve üçüncü durumlarda ise dizilerden birisinde eleman kalmamıştır. Bu durumlarda eleman kalan dizideki elemanlar doğrudan sonuç dizisine kopyalanabilir. Birleştirme Sıralamasının algoritma karmaşıklığına bakıldığında O(nlogn) olarak bulunur çünkü üzerinde çalışılan dizi her adımda 2ye bölünmüştür böylece sonuç dizisi olan 2şer elemanlı dizilere log2n adımda ulaşılabilir. Daha sonra her n eleman için sıralama yapıldığı ve her n eleman üzerinden geçildiği için bu değer çarpan olarak gelmekte ve sonuç nlog2n olarak bulunmaktadır.