Yığınlama Sıralaması (Heap Sort)

Slides:



Advertisements
Benzer bir sunumlar
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
Advertisements

Ders İçeriği Ağaç Veri Modeli Tanım ve Gerçekleştirim İkili Ağaç
FIRAT ÜNİVERSİTESİ TEKNOLOJİ FAKÜLTESİ
Karmaşıklık Giriş.
Yinelemeli Algoritma Analizi & Asimptotik Notasyon
Ayrık Yapılar Algoritma Analizi.
Diziler.
Bölüm 8 Diziler Dizi Tanımı Dizi Elemanlarına Değer Atama
IT503 Veri Yapıları ve algoritmalar
MIT503 Veri Yapıları ve algoritmalar Algoritma Oluşturma – Açgözlü algoritmalar ve buluşsallar Y. Doç. Yuriy Mishchenko.
BİLEŞİK ATAMA VE DÖNGÜLER
Yığın ve Kuyruk.
Ders İçeriği Bağlantılı Liste İki Yönlü Bağlantılı Liste
BPR152 ALGORİTMA VE PROGRAMLAMA - II
void medyan(int cevap[]) { int j; siralama(cevap);
Diziler & Kolleksiyonlar.  Çalışılan tüm objelerin bilinmemesi  Dinamik sayıda obje ile çalışmak  Benzer işlem yapılacak objeleri bir arada tutmak.
Veri Yapıları ve Algoritmalar dönem
Diziler Dizi, bellekte aynı isim altında toplanmış değişkenler kümesidir. Eğer ki aynı türden veriler grubunu bellekte tutmak gerekirse diziler kullanılır.
Elektrik-Elektronik Mühendisliği Bölümü DİZİLER C Programlama Dili Yaz Stajı Cengiz TEPE SAMSUN 2007.
Sorting Methods Basics of Sorting Elementary Sorting Algorithms
Özyinelemeli(Recursive) Algoritma Tasarımı
Algoritmalar DERS 3 Böl ve Fethet(Divide and Conquer) İkili arama
Özyineli Sıralama Algoritmaları
DÖNGÜ İFADELERİ.
BPR152 ALGORİTMA VE PROGRAMLAMA - II
Diziler.
DİZİLER.
Algoritmalar DERS 4 Çabuk sıralama Böl ve fethet Bölüntüler
MIT503 Veri Yapıları ve algoritmalar Sıralama algoritmaları
While Döngüsü Tekrarlama deyimidir. Bir küme ya da deyim while kullanılarak bir çok kez yinelenebilir. Yinelenmesi için koşul sınaması döngüye girilmeden.
C# Metot Overloading (Aşırı yükleme)
Veri Yapıları ve Algoritmalar
C#.NET 5.0 C# .NET 5.0 Eğitimleri Volkan KANAT.
Diziler Dizi, bellekte aynı isim altında toplanmış değişkenler kümesidir. Eğer ki aynı türden veriler grubunu bellekte tutmak gerekirse diziler kullanılır.
Programlamaya Giriş ve Algoritmalar
BM-103 Programlamaya Giriş Güz 2014 (8. Sunu)
Dizi Elemanlarının Sıralanması
HIZLI SIRALAMA ALGORİTMALARI(QUICK SORT)
C PROGRAMLAMA DİZİLER (ARRAYS).
Diziler (Arrays).
JAVA’DA DİZİLER Dr.Galip AYDIN.
Trees, Vectors, Iterators. ADT Abstract Data Type (ADT) vs implementation -Soyut Veri Türleri - Uygulamaları.
Ders İçeriği Liste Soyut veri yapısı (ADT)
Partially Ordered Trees (POT)
Diziler. Dizi Tanımı Dizi Elemanlarına Değer Atama Diziler ve Göstergeler 2-Boyutlu Diziler.
Bil 102 Bölüm 6 Diziler.
DİZİLER Arrays.
Çarpma İşleminin Özellikleri
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz.
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz.
Veri yapıları Hafta3 Dizi Yapıları.
Sıralama. Sıralama, bir dizideki sayısal elemanların küçükten büyüğe veya büyükten küçüğe, sayısal olmayan bir dizideki elemanların ise A’ dan Z’ ye.
ALGORİTMA KARMAŞIKLIĞI
Algoritmalar II Ders 1: Alan zaman takası yöntemi.
Insertion Sort Fikir: Oyun kartlarını sıralamaya benzer.
Algoritmalar II Ders 4 Dinamik Programlama Yöntemi.
C Sharp 9. hafta - dIZILER.
DİZİLER Bellekte sıralı bir şekilde bulunan ve aynı türden bilgilerin saklandığı veri yapısına dizi (array) denir. Örneğin kullanıcıdan 7 kişinin not ortalamasını.
İleri Algoritma Analizi
ARDUİNO Arduino Eğitimleri Bölüm 3 Programlama Dili Temelleri
Algoritma Nedir? Algoritmayı, herhangi bir problemin çözümü için izlenecek yolun adımlar halinde yazılması olarak tanımlayabiliriz. Algoritma, bir problemin.
Chapter 6 Dönüştür ve Yönet (Transform-and-Conquer)
NİŞANTAŞI ÜNİVERSİTESİ
İleri Algoritma Analizi
NİŞANTAŞI ÜNİVERSİTESİ
Bilgisayar Bilimi Fonksiyonlar-2.
MTM216 GÖRSEL PROGRAMLAMA
İleri Algoritma Analizi
Bölüm 5 Azalt ve yönet (Decrease-and-Conquer)
Sunum transkripti:

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.