Özyineli Sıralama Algoritmaları

Slides:



Advertisements
Benzer bir sunumlar
Yığınlama Sıralaması (Heap Sort)
Advertisements

Yığın ve Kuyruk.
Recursion (Özyineleme)
Algoritmalar DERS 4 Çabuk sıralama Böl ve fethet Bölüntüler
Görsel C# Programlama Güz 2009 (6. Hafta).
Özyineleme(Recursion)
Recursion (Özyineleme)
HIZLI SIRALAMA ALGORİTMALARI(QUICK SORT)
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz.
Veri Yapıları ve Algoritmalar
AVL Trees / Slide 1 Silme * Anahtar hedefi silmek için, x yaprağında buluruz ve sonra sileriz. * Dikkat edilmesi gereken iki durum vardır. (1) Hedef bazi.
Seramik Dental İmplantlar
BÖLÜM 5 . KÜTLE BERNOULLI ENERJI DENKLEMİ
HAZIRLAYANLAR AYHAN ÇINLAR YUNUS BAYIR
Yeniliği Benimseyen Kategorilerinin Bütüncül ve Analitik Düşünme Açısından Farklılıkları: Akıllı Telefonlar için Bir İnceleme Prof. Dr. Bahtışen KAVAK,
Doç. Dr. Hatice Bakkaloğlu Ankara Üniversitesi
Enerji Kaynakları-Bölüm 7
İŞGÜCÜ PİYASASININ ANALİZİ
Tıbbi ve Aromatik Bitkilerin Hayvansal Üretimde Kullanımı
Parallel Dağılmış İşlemci (Parallel Distributed Processing)
TANJANT Q_MATRİS Aleyna ŞEN M. Hamza OYNAK DANIŞMAN : Gökhan KUZUOĞLU.
Diksiyon Ödevi Konu:Doğru ve etkili konuşmada
ÇUKUROVA ÜNİVERSİTESİ KARATAŞ TURİZM İŞLETMECİLİĞİ VE OTELCİLİK
FACEBOOK KULLANIM DÜZEYİNİN TRAVMA SONRASI STRES BOZUKLUĞU, DEPRESYON VE SOSYODEMOGRAFİK DEĞİŞKENLER İLE İLİŞKİSİ  Psk. Asra Babayiğit.
BİLİŞİM TEKNOLOJİLERİ NEDİR?
PSİKO-SEKSÜEL (RUHSAL) PSİKO-SOSYAL
Sinir Dokusu Biyokimyası
ERGENLİKTE MADDE KULLANIMI
Şeyda GÜL, Fatih YAZICI, Mustafa SÖZBİLİR
MOL HESAPLARINDA KULLANILACAK BAZI KAVRAMLAR:
AKIŞKANLAR MEKANİĞİ 3. BASINÇ VE AKIŞKAN STATİĞİ
GAZLAR Yrd. Doç. Dr. Ahmet Emin ÖZTÜRK. GAZLAR Yrd. Doç. Dr. Ahmet Emin ÖZTÜRK.
CEZA MUHAKEMESİ HUKUKU
DİSİPLİN HUKUKU.
İZMİR.
ACİL YARDIM ve AFET YÖNETİMİ ÖĞRENCİLERİNİN KARAR VERME DÜZEYLERİ
TEMEL MAKROEKONOMİ SORUNLARI VE POLİTİKA ARAÇLARI
Modülasyon Neden Gereklidir?
A416 Astronomide Sayısal Çözümleme - II
İSTATİSTİK II Hipotez Testleri 1.
Ayçiçeği Neden Stratejik Ürün Olmalı?
Aydınlanma Işığın doğası ile ilgili bilgilerin tarihsel süreç içindeki değişimini farkeder. a. Dalga ve tanecik teorisinden bahsedilir,
Elektrik Enerjisi Üretimi, Dağılımı ve Depolanması
DENK KUVVET SİSTEMLERİ
Dil Materyalleri ve Çalışmaları Doç. Dr. Müdriye YILDIZ BIÇAKÇI
Anlamsal Web, Anlamsal Web Dilleri ve Araçları
FURKAN EĞİTİM VAKFI TEFSİR USULÜNE GİRİŞ
BİN AYDAN DAHA HAYIRLI GECE KADİR GECESİ
AKIŞKANLAR MEKANİĞİ 3. BASINÇ VE AKIŞKAN STATİĞİ
TÜCAUM 2016 ULUSLARARASI COĞRAFYA SEMPOZYUMU KARADENİZ BÖLGESİ ÖRNEĞİ
11. SINIF: ELEKTRİK ve MANYETİZMA ÜNİTESİ Alternatif Akım 2
HİGGS HAKKINDA NAZLI FANUS FEN BİLİMLERİ ÖĞRETMENİ ULUPAMİR ORTAOKULU
7 AĞIRLIK VE GEOMETRİK MERKEZ.
Doç. Dr. Senayi DÖNMEZ Doç. Dr. Ahmet Emre TEKELİ
Endometrium Kanserinde Fertilite Koruyucu Tedavi
Sağlık Bilimleri Fakültesi
Cumhuriyet Dönemi ve Sonrası Türk Mimarisi
MUHASEBE ve DENETİM Lisans Programı
PARAMETRİK OLMAYAN HİPOTEZ TESTLERİ
KURAL 1- OYUN ALANI Saha Zemini: Oyunlar; parke, kauçuk vb. voleybol oynanabilen zeminlerde oynanır. Sahanın rengi değişiklik gösterebilmekle birlikte.
İDARİ YARGI SİSTEMİ VE DENETİMİNİN KAPSAMI-SINIRLARI
Doç.Dr. Mehmet Birhan YILMAZ Cumhuriyet Üniversitesi Kardiyoloji AD
OSI Modeli ve TCP/IP Modeli
Algoritma Nedir? Algoritmayı, herhangi bir problemin çözümü için izlenecek yolun adımlar halinde yazılması olarak tanımlayabiliriz. Algoritma, bir problemin.
İleri Algoritma Analizi
NİŞANTAŞI ÜNİVERSİTESİ
NİŞANTAŞI ÜNİVERSİTESİ
İleri Algoritma Analizi
Chapter 4 Divide-and-Conquer
Bölüm 5 Azalt ve yönet (Decrease-and-Conquer)
Sunum transkripti:

Özyineli Sıralama Algoritmaları Yrd.Doç.Dr. Burhan ERGEN 1

Hızlı Sıralama (Quicksort) Hızlı Sıralama böl ve yönet mantığına dayanır. Bütün işlem parçalara ayırma kısmında özyineli olarak başarılır. Şöyle Çalışır: Önce, bir dizi iki parçaya ayrılır, Sonra, parçaları bağımsız olarak sıralar, Son olarak, sıralı alt diziler basitçe yan yana getirilerek birleştirilir. 2 2

Hızlı Sıralama Hızlı sıralaması şu üç adımı içerir: 1. Böl: Listeyi parçalara ayır. Listeyi parçalamak için, listenin ortanca elemanı olabileceği umulan bir eleman/anahtar/veri seçilir. Bu pivot olarak isimlendirilir. Then we partition the elements so that all those with values less than the pivot come in one sublist and all those with greater values come in another.  2. Özyineleme: Özyineli olarak alt listeleri de parçalara ayır.  3. Yönet: Sıralı listeleri bir araya getir. 3 3

Parçalama (Partition) Sıralama Parçalama (Partition) Parçalama, pivotu dizide doğru yere getirir. P pivotu etrafında diziyi düzenlemek iki daha küçük sıralama problemini oluşturur. Sol tarafı sırala, sağ tarafı sırala. Bu daha küçük iki sıralama problemi özyineli olarak alt dizilere uygulandığında, büyük problemimiz çözülmüş olur. 4

Quicksort Function Sıralama void quickSort( int array[], int first, int last){ int pivotIndex; if (first <last){ pivotİndex= partition(array, first, last); //Listeyi parçala quictSort(array, first, pivotIndex-1); //Alt yarıyı sırala quictSort(array, pivotIndex+1, last); //Üst yarıyı sırala } 5

Parçalama – Pivotu Seçma Sıralama Parçalama – Pivotu Seçma Önce, diziden pivot değeri seçilir, Sonra, parçalamadan önce ilk indise taşınır. Hangi dizi elemanı pivot olarak seçilmelidir? Öyle bir pivot seçilmeli ki, iyi bir parçalama yapabilsin. Eğer dizi rastgele bir yapıda ise, rast gele bir pivot seçimi yapılabilir. O halde, ilk veya son eleman pivot olarak seçilebilir. Fakat iyi bir parçalama yapamayabilir. Bu nedenle, pivot seçimi için bir çok teknik kullanılabilir. En mantıklı olan pivotu ortadan seçmektir. 6 6

Parçalama Fonksiyonu (Partition Function) Sıralama Parçalama Fonksiyonu (Partition Function) int partition( int array[], int first, int last){ int pivotValue, pivotIndex, middle;   middle = (first + last) /2; swap( array[first], array[middle]); pivotIndex = first; pivotValue = array[first]; //pivotIndex sabit değil, for döngüsü // içerisinde son durum için pivotun //geleceği yeri bulmak için kullanılıyor for ( int i=first+1; i<=last; i++){ if (array[i] < pivotValue){ pivotIndex++; swap(array[pivotIndex], array[i]); }   swap(array[first], array[pivotIndex]); return pivotIndex; 7

Parçalama Fonksiyonu Sıralama Pivot ilk eleman olduktan sonra, parçalama için ara durum. İncelenecek bilinmeyenler (last) Son İndeks (first) İlk İndeks (pivotIndex) Enson bulunun küçük eleman ( i ) İncelenecek bilinmeyen ilk eleman 8

Enson bulunun küçük eleman Sıralama Parçalama Fonksiyonu Dizinin başlangıç durumu (first) İlk İndeks ( i ) İncelenecek bilinmeyen ilk eleman (pivotIndex) Enson bulunun küçük eleman 9

Parçalama Fonksiyonu Sıralama İncelenen eleman küçük ise pivotIndex bir arttırılır, yer değiştirme yapılır. pivotIndex ve i bir artmıştır. İncelenecek bilinmeyenler (first) İlk İndeks pivotIndex pivotIndex+1 (last) Son İndeks ( i ) İncelenecek bilinmeyen ilk eleman 10

Parçalama Fonksiyonu Sıralama Eğer incelen eleman zaten büyük ise, araştırma indeksi (i) bir arttırılır. İncelenecek bilinmeyenler (last) Son İndeks (first) İlk İndeks (pivotIndex) Enson bulunun küçük eleman ( i ) İncelenecek bilinmeyen ilk eleman 11

Parçalama Fonksiyonu Sıralama Pivotun ilk eleman olması durumunda; İlk parçalamanın gelişimi 12

void QuickSort(int array[], int left, int right){ int i, //Soldan yaklaşan indeks j, // Sağdan yaklaşan indeks pivotValue; //pivot değer   if (left<right){ i=left; j= right+1; pivotValue=array[left]; while(i<j){ do i++ while (array[i] < pivotValue); do j-- while (array[j] > pivotValue); if (i<j) swap(array[i], array[j]); }   swap(array[left],array[j]); QuickSort(array, left, j-1); QuickSort(array, j+1, right); } //ifend }//QuickSortend 13

Birleştirme Sıralaması (Mergesort) Birleştirme sıralama algoritması da, böl ve yönet mantığına dayanır (Hızlı Sıralama gibi). Öz yineli yapısı şöyle işler; Listeyi iki parçaya böl, Her bir parçayı ayrı ayrı sırala, Sıralı parçaları, bir sıralı listede birleştir.

Birleştirme Sıralaması Dizi: 8 1 4 3 2 İki parçaya ayır. 1 4 8 2 3 Parçaları sırala Parçaları birleştir. Geçici dizi: 1 2 3 4 8 Orijinal diziye kopyala theArray: 1 2 3 4 8

Birleştime Sırlaması (Mergesort) Sıralama Birleştime Sırlaması (Mergesort) void mergesort(int theArray[],int first,int last) { if (first < last) { int mid = (first + last)/2; //orta nokta mergesort(theArray, first, mid); mergesort(theArray, mid+1, last); // İki yariyi birlestir merge(theArray, first, mid, last); } } // end mergesort

Birleştirme (Merge) Sıralama void merge(int theArray[], int first, int mid, int last){ int tempArray[last-first+1]; // geçici dizi int first1 = first; // ilk alt dizinin başlangıcı int last1 = mid; // ilk alt dizinin sonu int first2 = mid + 1; // ikinci alt dizinin başlangıcı int last2 = last; // ikinci alt dizinin sonu int index = 0; // geçici dizideki bir sonraki muhtemel yer while( first1 <= last1 && first2 <= last2){ if (theArray[first1] < theArray[first2]) { tempArray[index] = theArray[first1]; ++first1; }else { tempArray[index] = theArray[first2]; ++first2; } ++index;

Birleştirme (Merge) Sıralama // İkinci alt dizi bitirildi, eğer kalan varsa while(first1 <= last1){ tempArray[index] = theArray[first1]; ++first1; ++index; } // ilk alt dizi bitirildi, eğer kalan var ise while(first2 <= last2){ tempArray[index] = theArray[first2]; ++first2; ++index; // sonucu, asıl diziye geri kopyala for (index = 0; index <= last-first; ++index) theArray[index+first] = tempArray[index]; } // end merge

Birleştirme (Merge) Sort Örneği Sıralama Birleştirme (Merge) Sort Örneği 6 3 9 1 5 4 7 2 divide 6 3 9 1 5 4 7 2 divide divide 7 2 6 3 9 1 5 4 divide divide divide divide 6 3 9 1 5 4 7 2 merge merge merge merge 2 7 3 6 1 9 4 5 merge merge 1 3 6 9 2 4 5 7 merge 1 2 3 4 5 6 7 9

Birleştirme Sıralaması (Merge Sort) // A’yi ve B’yi C de birleştir public void merge( int[] arrayA, int sizeA, int[] arrayB, int sizeB, int[] arrayC ) { int aDex=0, bDex=0, cDex=0; while(aDex < sizeA && bDex < sizeB) // Boş liste var mı? if( arrayA[aDex] < arrayB[bDex] ) arrayC[cDex++] = arrayA[aDex++]; else arrayC[cDex++] = arrayB[bDex++];   while(aDex < sizeA) // arrayB tükendi mi? while(bDex < sizeB) // arrayA tükendi mi? } 20

Birleştirme Sıralaması (Merge Sort) Sıralı İki Bağlı Listenin Birleştirilmesi

public void mergeSort( Node head) { if (head != NULL && head.next != NULL) { Node secondhalf = dividefrom(head); // İkiye böl mergeSort(head); // ilk yarıyı sırala mergeSort(secondhalf); // ikinci yarıyı sırala head = merge(head, secondhalf); // listeleri birleştir }   Node dividefrom(Node head) { Node position, midpoint, second_half; if ((midpoint = head) == NULL) return NULL; //Liste boş position = midpoint.next; while (position != NULL) { // position iki kat hızli position = position.next; if (position != NULL){ midpoint = midpoint.next; secondhalf = midpoint.next; midpoint.next = NULL; return second_half; Node merge(Node first, Node second){ Node lastSorted; // sıralı listede son düğümü Node combined; // geçici olarak birleştirilmiş liste if (first.value <= second.value){ combined = first; first = first.next; // bir sonraki birlestirilmemiş düğüme geç } else { combined = second; second = second.next; lastSorted = combined; while (first != NULL && second != NULL){ // küçük düğümü bağla if (first.value <= second.value) { lastSorted.next = first; lastSorted = first; first = first.next; // bir sonraki birşeltirilmemiş düğüme geç lastSorted.next = second; lastSorted = second; // herhangi bir liste tükendikten sonra, geri kalanı listenin sonuna ekle if (first == NULL) else return combined;   22

 public void mergeSort( Node head) { if (head != NULL && head.next != NULL) { Node secondhalf = dividefrom(head); // İkiye böl mergeSort(head); // ilk yarıyı sırala mergeSort(secondhalf); // ikinci yarıyı sırala head = merge(head, secondhalf); // listeleri birleştir   }  

  Node dividefrom(Node head) { Node position, midpoint, second_half; if ((midpoint = head) == NULL) return NULL; //Liste boş position = midpoint.next; while (position != NULL) { // position iki kat hızli position = position.next; if (position != NULL){ midpoint = midpoint.next; } secondhalf = midpoint.next; midpoint.next = NULL; return second_half;

while (first != NULL && second != NULL){ // küçük düğümü bağla if (first.value <= second.value) { lastSorted.next = first; lastSorted = first; first = first.next; // bir sonraki birşeltirilmemiş düğüme geç } else { lastSorted.next = second; lastSorted = second; second = second.next; // herhangi bir liste tükendikten sonra, geri kalanı listenin sonuna ekle if (first == NULL) else return combined;   Node merge(Node first, Node second){ Node lastSorted; // sıralı listede son düğümü Node combined; // geçici olarak birleştirilmiş liste if (first.value <= second.value){ combined = first; first = first.next; // bir sonraki birlestirilmemiş düğüme geç } else { combined = second; second = second.next; lastSorted = combined;  

public node mergesort (node list1) {    public node mergesort (node list1) { if (list1 == null || list1.next == null) return list1; node list2 = devide (list1); list1 = mergesort (list1); list2 = mergesort (list2); return merge (list1, list2); }  public node devide (node list1) { if (list1 == null || list1.next == null) return null; node list2 = list1.next; list1.next = list2.next; list2.next = devide (list2.next); return list2;    public node merge (node list1, node list2) { if (list1 == null) return list2; if (list2 == null) return list1; if (list1.value < list2.value) { list1.next = merge (list1.next, list2); return list1; } else { list2.next = merge (list1, list2.next); return list2; 26