Merge Sort Bireşen Sıralama

Benzer belgeler
Merge (Bireşim) Algoritmayı önce bir örnek üzerinde açıklayalım.

Binary Search. (Yarılama) Bölüm Dizide Bir Öğe Arama

Insertion Sort. (Sokuşturma Sıralaması)

Quick Sort Algoritması (Hızlı Sıralama Algoritması)

İST 264 VERİ YAPILARI Bitirme Sınavı A Grubu

BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI

Bilgisayar programlamanın üç temel mantık yapısından biridir. Diğer ikisi ise Seçilim(Selection) ve Döngü(Loop, Iteration)dür.

D İ Z İ L E R A R R A Y S

Kıyametin Kopacağı Gün (Hanoi Bilmecesi)

BMÜ-111 Algoritma ve Programlama. Bölüm 5. Tek Boyutlu Diziler

YZM 2116 Veri Yapıları

1. Her marka için 3 aylık satış toplamı nedir? (Tablodaki satır toplamları)

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

Programlama Dilleri 3

YMT219 VERİ YAPILARI ÖDEV-1

VERİ YAPILARI DATA STRUCTURE GİRİŞ

11- FONKSİYONLAR (FUNCTIONS)

JAVADA DİZİ İŞLEMLERİ

Interface Comparator. Kılgılayan sınıf: Collator. Bildirimi: public interface Comparator

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Kodlanacak programlama dilinin kaynaklarından faydalanılarak kod yazımı yapılır.

Java String İşlemleri

Ders 4: Diziler (Arrays( Arrays) barisgokce.com

C# Console Uygulamaları ifelse Yapıları 2

Dizi ( Array ) ve Dizgi ( String )

DÖNGÜLER BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA GİRİŞ LABORATUARI BMÜ-101 ALGORİTMA VE PROGRAMLAMAYA DENEY-4 FÖYÜ GİRİŞ LABORATUARI.

RSA ANAHTAR DAĞITIMI VE RSA İLE DİJİTAL İMZA OLUŞTURMA

Arasınav Örnek Soruları Bahar 2018

BİL1001 Bilgisayar Bilimlerine Giriş 1

// hataları işaret eden referans

I Java Veri Yapıları 1

Java ile Nesneye Yönelik Programlama (Object Oriented Programming)

HSancak Nesne Tabanlı Programlama I Ders Notları

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

Örnek 1: Programı yazın ve çalıştırın.

static void dizi_24() { Random rnd = new Random(); int [] tutulan=new int[10]; int dogru;

Veri Yapıları ve Algoritmalar dönem

KUYRUKLAR QUEUES. Doç. Dr. Aybars UĞUR

Algoritmalar. Doğrusal Zamanda Sıralama. Bahar 2017 Doç. Dr. Suat Özdemir 1

Sınav Dağılım & IMKB Endeks

BMÜ-112 ALGORİTMA VE PROGRAMLAMA-II LABORATUARI DENEY-2 FÖYÜ

Algoritmalar. Sıralama Problemi ve Analizi. Bahar 2017 Doç. Dr. Suat Özdemir 1

Algoritmalar. Heap Sort. Bahar 2017 Doç. Dr. Suat Özdemir 1

HACETTEPE ÜNİVERSİTESİ BAHAR DÖNEMİ

SIRALAMA SORTING. Yrd. Doç. Dr. Aybars UĞUR

Bire-bir Sahiplik İlişkisi ile İlgili Sorular:

C# Yazım Kuralları ERCİYES. Ü. BİLGİSAYAR M. COMPUTER PROGRAMMING II 1 FEHİM KÖYLÜ

JAVA PROGRAMLAMA DİLİ ÖZELLİKLERİ

ARRAY Alıştırmalar. Program 1: Aşağıdaki program, array kullanmadan, 5 tane değişken tanımlayıp, onların değerlerini konsola yazıyor.

BMÜ-111 ALGORİTMA VE PROGRAMLAMA AKIŞ KONTROLÜ YRD. DOÇ. DR. İLHAN AYDIN

Özyineleme (Recursion)

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 9. UYGULAMA

BM102 BİLGİSAYAR PROGRAMLAMA II LABORATUVAR UYGULAMALARI. 3Hafta

Örneğin iki sayının toplamının hesaplayacak bir fonksiyon şöyle tanımlanabilir:

Karşılaştırma İşlemleri ve Koşullu İfadeler

Class PriorityQueue. Class PriorityQueue<E> java.lang.object java.util.abstractcollection<e> java.util.abstractqueue<e> java.util.

DÖNGÜLER BMÜ-111 ALGORİTMA VE PROGRAMLAMA-I YRD. DOÇ. DR. İLHAN AYDIN

Alıştırma 1: Yineleme

Java Class Yapısında Finalize Metotunun Kullanımı

Yığıtın en üstündeki öğeyi değer olarak alır; ama onu yığıttan almaz, yerinde bırakır.

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

NESNEYE YÖNELİK PROGRAMLAMA

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 4. UYGULAMA

NESNEYE DAYALI PROGRAMLAMA 9. HAFTA UYGULAMA DERSİ

b) Algoritmanızın en kötü durumda işlem zamanını asimptotik olarak bulunuz

Ders - 7 while döngüsü

YZM ALGORİTMA ANALİZİ VE TASARIM DERS#1: ALGORİTMA KAVRAMI

elemanlarının gezilmesine yönelik bir örnek sunulmuştur, inceleyiniz.

BİL-141 Bilgisayar Programlama I (Java)

Dizi türündeki referanslar, dizi nesnelerine bağlanmaktadır. Dizi referansları tanımlamak bu dizinin hemen kullanılacağı anlamına gelmez...

Soru 1: Fahrenheit cinsinden verilen sıcaklığı Kelvin'e çeviren bir program yazınız. Aşağıdaki dönüşüm formülünü kullanabilirsiniz:

Lab7 DOĞU AKDENİZ ÜNİVERSİTESİ BİLGİSAYAR VE TEKNOLOJİ YÜKSEKOKULU BİLGİSAYAR PROGRAMCILIĞI. BTEP212 Java. Uygulama1: package javaapplication58;

Javada Diziler. Javada diziler

Klavyeden Basit Giriş/Çıkış İşlemleri

Programın Akışının Denetimi. Bir arada yürütülmesi istenen deyimleri içeren bir yapıdır. Söz dizimi şöyledir:

BIL101 07/11/2012 Lab5 Programlama Sorulari

Nesneye Dayalı Programlama

VERİ YAPILARI DERS NOTLARI BÖLÜM 1 GİRİŞ. Yard. Doç. Dr. Deniz KILINÇ

Arasınav Soruları Bahar 2018

CharArrayReader. Kılgıladığı Arayüzler: Bildirimi: Değişkenleri (fields): java.io.reader Sınıfından Kalıtsal Gelen Değişken:

SIRALAMA SORTING. Doç. Dr. Aybars UĞUR

C# Çalışma Örnekleri

Algoritmalara Giriş J/18.401J Ders 15. Dinamik Programlama En uzun ortak altdizi En uygun altyapı Altproblemlerin çakışması

BİL-341 ALGORİTMALAR BÜYÜK O NOTASYONU AHMET ATAKAN atakanahmet@hotmail.com KIRGIZİSTAN-TÜRKİYE MANAS ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ

YZM 2116 Veri Yapıları

while(), do-while(), for() M.İLKUÇAR 2010 MAKU-MYO

2 ALGORİTMA VE AKIŞ DİYAGRAMLARI

KUYRUKLAR. Doç. Dr. Aybars UĞUR

Olimpiyat Soruları. sonuçları tekrar fonksiyonda yerine koyup çıkan tüm sonuçları toplayan program (iterasyon sayısı girilecek)

Görsel Programlama DERS 03. Görsel Programlama - Ders03/ 1

Yrd. Doç. Dr. A. Burak İNNER Bilgisayar Mühendisliği

public static int Toplam int x, int y

1. Aşağıdaki program parçacığını çalıştırdığınızda result ve param değişkenlerinin aldığı en son değerleri ve programın çıktısını yazınız.

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 2 DERSİ LAB. ÖDEVİ

DATA STRUCTURES. Lab II Metotlar, Diziler ve Hata Ayıklama. Prof. Dr. Aybars UĞUR

GÜZ DÖNEMİ AKT105 BİLGİSAYAR PROGRAMLAMA DERSİ 6. UYGULAMA

Diziler. Yrd.Doç.Dr.Bülent ÇOBANOĞLU

Nesne Tabanlı Programlama

Bir c sınıfının doğal sıralaması ile tutarlı olması (be consistent with equals) demek, c sınıfı içindeki her e1 ve e2 nesnesi için

İNÖNÜ ÜNİVERSİTESİ MÜH. FAK. BİLGİSAYAR MÜH. BÖL. ALGORİTMA VE PROGRAMLAMA 1 DERSİ LAB. ÖDEVİ

Transkript:

Merge Sort Bireşen Sıralama Merge sort (bireşen sıralama), diziyi ardışık olarak en küçük alt dizilerine kadar yarılayan sonra da onları sıraya koyarak bireştiren özyineli bir algoritmadır. Yarılama işlemi en büyük alt dizi en çok iki öğeli olana kadar sürer. Sonra merge (bireşim) işlemiyle altdiziler ikişer ikişer bölünüş sırasıyla sıralı olarak bir üst dizide bireşir. Süreç sonunda en üstte sıralı diziye ulaşılır. Bu algoritma O(nlogn) grubuna ait etkin bir sıralama yöntemidir. Bu algoritmanın nasıl çalıştığını açıklamak için şöyle bir örnek verelim. Bir salonda yapılacak törene çağrılan 100 kişinin adları yazılı birer etiket, koltuklara harf sırasıyla yapıştırılacaktır. Etiketler sırasız biçimde veriliyor. Etiketleri doğru sıraya dizmesi için görevliye önerebileceğimiz bir çok yöntem arasında en hızlı olanlardan birisi şudur. A. Diziyi en çok 2 öğeli alt dizilere ulaşana kadar ortadan ikiye böl. a. Karışık etiketleri ortadan iki altdiziye böl. 50 şer etiketlik sırasız iki altdizi oluşur. b. 50 şer etiketlik iki alt dizinin her birini kendi içinde 25 şer etiketlik altdizilere böl. Sırasız dört altdizi oluşur. c. Aynı yöntemi uygulayarak, 25 şer etiketlik altdizilerin her birini 12 ve 13 etiketlik altdizilere böl. d. 12 etiketlik alt dizileri ikişer tane 6 etiketlik altdizilere; 13 etiketlik alt dizileri ise 6 ve 7 etiketlik altdizilere böl. e. 6 etiketlik alt dizileri ikişer tane 3 er etiketlik altdizilere, 7 etiketlik olanları ise 3, ve 4 etiketlik ikişer altdizilere böl. f. 3 er etiketlik alt dizileri 1 ve 2 etiketlik altdizilere, 4 etiketlik altdizileri ise 2 şer etiketlik altdizilere böl. B. Bölünen alt dizileri, bölünüşün ters yönünde ikişer ikişer merge (bireşim) algoritması ile sıralı olarak bireştir. a. 1 ve 2 etiketlik altdizilere merge algoritmasını uygulayarak 3 etiketlik sıralı üstdizileri oluştur. Aynı yöntemle 2 etiketlik altdizileri bireştirerek 4 etiketlik sıralı üstdizileri oluştur. b. 3 ve 4 etiketlik dizilere merge algoritmasını uygula; 6 ve 7 etiketlik sıralı üstdizileri oluştur. c. 6 ve 7 etiketlik dizilere merge algoritmasını uygula; 12 ve 13 etiketlik sıralı üstdizileri oluştur. d. 12 ve 13 etiketlik dizilere merge algoritmasını uygula; 25 etiketlik sıralı üstdizileri oluştur. e. 25 etiketlik dizilere merge algoritmasını uygula; 50 etiketlik sıralı üstdiziyi oluştur. Yukarıda söylenenleri bir yalancı kod (pseudo code) biçiminde yazalım. Her hangi bir adımdaki altdiziyi a*sol sağ+ simgesiyle gösterelim. sol altdizinin en küçük indisi, sağ ise altdizinin en 1

büyük indisi olsun. sol < sağ ise m = (sol+sağ)/2 diyelim. Bu bir tamsayı bölme işlemidir; yani m sayısı bölümün tamsayı kısmıdır. A. Altdizilere bölme ve sıralama: a. a*sol m+ altdizisini sırala; b. a[m+1 sağ] altdizisini sırala; c. a*sol m+ ile a[m+1 sağ] altdizilerini sıralı bireştir; d. Bireşen diziyi verilen dizi üstüne kopyala; e. Dur. Tabii, burada bölme ve bireştirme işlemleri özyinelidir. Süreç bitene kadar bölme ve bireştirme işlemleri devam eder. Şimdi de bunu bir örnek üzerinde şekille gösterelim. Basitliği sağlamak için 10 terimli bir bir dizi alalım. String a = Yüce, Ulusoy, Aygün, Volkan, Çelik, Can, Alp, Baydar, Kazan, Demir ; String dizisi verilsin. Şimdi bu dizinin merge sort algoritması ile sıralanışını şekil üzerinde gösterelim. Ulusoy Yüce Aygün Çelik Volkan Alp Can Baydar Demir Kazan Ulusoy Yüce Aygün Çelik Volkan Alp Can Baydar Demir Kazan Aygün Çelik Ulusoy Volkan Yüce Alp Baydar Can Demir Kazan Alp Aygün Baydar Can Çelik Demir Kazan Ulusoy Volkan Yüce Şimdi bu algoritmayı yapan özyineli (recursive) metotları yazalım. İstersek bölme ve bireştirme işlemlerini yapan kodları bir metotta bir araya getirebiliriz. Ama, daha anlaşılır olması için, bölme ve bireştirme işlemlerini ayrı ayrı metotlarla yapabiliriz. Zaten, bireştirme algoritmasını daha önceden biliyoruz. Aşağıdaki özyineli metot, diziyi en küçük alt dizilerine ayırır ve özyineli merge metodunu çağırarak sıralı bireşim işlemini yaptırır. void mergesort(int alt, int üst) if (alt<üst) int m=(alt+üst)/2; mergesort(alt, m); mergesort(m+1, üst); Anımsayınız. Aşağıdaki merge metodu şu işleri yapar: 1. Verilen a[] dizisinin öğelerini yedek b[] dizisine kopyala 2. i <= m ve j <= üst olduğunda a*k+ = min,a*i+, b*j+- 2

3. Geri kalan altdizinin bütün öğelerini a[] ya ekle void merge(int alt, int m, int üst) for (i=alt; i<=üst; i++) b[i]=a[i]; i=alt; j=m+1; k=alt; while (i<=m && j<=üst) if (b[i]<=b[j]) a[k++]=b[i++]; else a[k++]=b[j++]; while (i<=m) a[k++]=b[i++]; //package mergesort; //import java.util.arrays.*; public class MergeSort01 static int a[] = 12, 9, 4, 99, 120, 1, 3, 10 ; public static void main(string[] args) mergesort(0, 7); diziyaz(a); static void mergesort(int alt, int üst) if (alt < üst) int m = (alt + üst) / 2; mergesort(alt, m); mergesort(m + 1, üst); static void merge(int alt, int m, int üst) int[] b = new int[8]; for (i = alt; i <= üst; i++) b[i] = a[i]; i = alt; j = m + 1; k = alt; while (i <= m && j <= üst) if (b[i] <= b[j]) 3

else a[k++] = b[j++]; while (i <= m) static void diziyaz(int[] arr) for (int i = 0; i < arr.length; i++) System.out.print(arr[i] + " "); İstenirse, yukarıdaki programda static nitelemeli array ile metotlar dinamik yapılabilir. Aşağıdaki program o işi yapmaktadır. //package mergesort; //import java.util.arrays; public class MergeSort01 int a[] = 12, 9, 4, 99, 120, 1, 3, 10 ; public static void main(string[] args) MergeSort01 ms = new MergeSort01(); ms.mergesort(0, 7); ms.diziyaz(ms.a); void mergesort(int alt, int üst) if (alt < üst) int m = (alt + üst) / 2; mergesort(alt, m); mergesort(m + 1, üst); void merge(int alt, int m, int üst) int[] b = new int[8]; for (i = alt; i <= üst; i++) b[i] = a[i]; i = alt; j = m + 1; k = alt; while (i <= m && j <= üst) if (b[i] <= b[j]) 4

else a[k++] = b[j++]; while (i <= m) void diziyaz(int[] arr) for (int i = 0; i < arr.length; i++) System.out.print(arr[i] + " "); Bölümün başında açıkladığımız String arrayini sıralayan program. //package mergesort; //import java.util.arrays; public class MergeSort01 String[] a = "Yüce", "Ulusoy", "Aygün","Volkan","Çelik", "Can", "Alp", "Baydar", "Kazan", "Demir"; public static void main(string[] args) MergeSort01 ms = new MergeSort01(); ms.mergesort(0, 9); ms.diziyaz(ms.a); void mergesort(int alt, int üst) if (alt < üst) int m = (alt + üst) / 2; mergesort(alt, m); mergesort(m + 1, üst); void merge(int alt, int m, int üst) String[] b = new String[10]; for (i = alt; i <= üst; i++) b[i] = a[i]; i = alt; j = m + 1; k = alt; while (i <= m && j <= üst) int r = b[i].compareto(b[j]); 5

if (r < 0) else a[k++] = b[j++]; while (i <= m) void diziyaz(string[] arr) for (int i = 0; i < arr.length; i++) System.out.print(arr[i] + " "); 6