Verinin hafızada sıralı tutulması için
geliştirilen sıralama algoritmalarından biridir.
Yığı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. Bu verilerin
bir oluşumun belirleyici alanları olduğunu düşünebiliriz.
Algoritmanın Çalışması
Algoritma adımları şu şekilde özetlenebilir:
1. Sayı dizisinden bir ağaç oluşturulur.
2. Bu
ağaç yaprak olmayan en son elemandan ilk(kök) elemana doğru heapify
metoduyla yığınlaştırılır.
3. En
üstte(kökte) duran yani en büyük olan değer alınarak sonuç dizisinin son
elemanı yapılır.
4. Sonra
geriye kalan sayılar tekrar yığınlaştırılır (heapify) ve bu işlem eleman
kalmayana kadar yapılırsa sonuç dizisindeki veriler sıralanmış olarak elde
edilir.
5. Bu
sayı dizisi ilk başta verilen sayı dizisinin küçükten büyüğe sıralanmış
halidir.
Düğüm
Yüksekliği (Height of a Node): Düğümden itibaren düğümün yapraklara(leafs)
uzaklığıdır.
Düğüm
Seviyesi (Level of a Node): Düğümün köke(root) olan uzaklığıdır.
Ağaç
Yüksekliği (Height of Tree): Kökün maksimum seviyedeki yaprağa olan uzaklığıdır.
1. Her bir seviyedeki maksimum düğüm sayısı.
Root: A[1]
Left child:
A[i] = A[2i]
Right child:
A[i] = A[2i + 1]
Parent: A[i] =
A[ ëi/2û ]
HeapSize[A] ≤
length[A]
Max Heap (root en büyük eleman):
A[PARENT(i)] ≥
A[i]
Min Heap (root en küçük eleman):
A[PARENT(i)] ≤
A[i]
Max-Heap'e göre düzenlemek için: MAX-HEAPIFY
Heapify(Yığınlaştır) en büyük çocuğu, ebeveyni ile karşılaştırılır. Ebeveyn büyükse zaten heapify gereklerini sağlar, aksi durumda ise büyük çocuk ile ebeveyn yer değiştirir. Böylece ebeveyn kendi çocuklarından daha büyük olur.
public static void MaxHeapify( int[ ] arr, int i ) { int left = 2 * i + 1; int right = 2 * i + 2; int largest = i; if( left < arr.length && arr[ left ] > arr[ largest ] ) largest = left; if( right < arr.length && arr[ right ] > arr[ largest ] ) largest = right; if( largest != i ) { int temp = arr[ i ]; arr[ i ] = arr[ largest ]; arr[ largest ] = temp; MaxHeapify( arr, largest ); } }
Sırasız bir diziden max-heap oluşturmak için: BUILD-MAX-HEAP
Bir diziyi A [ 1,…,n] dönüştürmek için aşağıdan yukarıya doğru Heapify
fonksiyonu işletilir. Heap alt dizinin A [ n / 2 +1,…,n ] BUILD-HEAP ile alt
dizi indisleri Heapfiy ile ağacın ebeveyn ve çocukları üzerinde swap(değiştirme) işlemi
uygulanır.
public static void BuildMaxHeap( int[ ] arr ) { for( int i = (int)Math.floor(arr.length/2);i >= 0; i--) MaxHeapify( arr, i ); }
Diziyi sıralamak için: HEAPSORT
Yığın sıralama algoritması
giriş dizisi A[1,…,n] üzerinde bir yığın
oluşturmak için BUILD-HEAP fonksiyonu ile başlatılır. Kök A [1] bulunan maksimum
eleman dizinin sonuna alınır ve dizi boyutu her döngüde bir azaltılır.
Heapify simülasyonu için kullanılacak sırasız dizi: A[2,7,26,25,19,17,1,90,3,36]
public static void HeapSort(int[ ] arr ) { int heapSize=arr.length; BuildMaxHeap(arr); for( int i = heapSize;i >= 0; i=i-2) { int temp = arr[ i ]; arr[ i ] = arr[ 1 ]; arr[ 1 ] = temp; heapSize=heapSize-1; MaxHeapify( arr, 1 ); } }
Heapify simülasyonu için kullanılacak sırasız dizi: A[2,7,26,25,19,17,1,90,3,36]
Heapify simülasyonu için kullanılan dizinin sıralı yığınlaştırılmış hali: A[90,36,26,25,19,17,1,7,3,2]
MAX-HEAPIFY Çalışma Zamanı (Running Time)
MAX-HEAPIFY çalışma zamanı: O(lgn)
BUILD-MAX-HEAP Çalışma Zamanı (Running Time)
MAX-HEAPIFY BUILD-MAX-HEAP fonksiyonu içerisinde 1-n/2 aralığında döngü oluşturur.
MAX-HEAPIFY fonksiyonu BUILD-MAX-HEAP içerisinde O(n) kadar çalıştığı içinde:
Toplam çalışma zamanı O(nlgn) olur bu çalışma zamanını daha alt seviyelere düşürmek için bir dizi işlem uygulanır:
HEAPSORT Çalışma Zamanı (Running Time)
MAX-HEAPIFY fonksiyonu BUILD-MAX-HEAP içerisinde O(n) kadar çalıştığı içinde:
HEAPSORT içerisinde n-1 O(nlgn) işlem görür. Bu nedenle çalışma zamanı aynı olacaktır.
Bir sonraki yazımda görüşmek üzere...
Her seviye 2 karşılaştırma içerdiğinden 2h olur.
MAX-HEAPIFY çalışma zamanı: O(lgn)
BUILD-MAX-HEAP Çalışma Zamanı (Running Time)
MAX-HEAPIFY BUILD-MAX-HEAP fonksiyonu içerisinde 1-n/2 aralığında döngü oluşturur.
Toplam çalışma zamanı O(nlgn) olur bu çalışma zamanını daha alt seviyelere düşürmek için bir dizi işlem uygulanır:
MAX-HEAPIFY fonksiyonu BUILD-MAX-HEAP içerisinde O(n) kadar çalıştığı içinde:
HEAPSORT içerisinde n-1 O(nlgn) işlem görür. Bu nedenle çalışma zamanı aynı olacaktır.
Bir sonraki yazımda görüşmek üzere...