![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#1 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıSıralama algoritmaları Sıralama algoritması Ağaç sıralaması Basamağa göre sıralama Birleştirmeli sıralama Cüce sıralaması Eklemeli sıralama Güvercin yuvası sıralaması Hızlı sıralama Kabarcık sıralaması Kabuk sıralaması Kokteyl sıralaması Kova sıralaması Kütüphane sıralaması Rahat sıralama Sabır sıralaması Sayarak sıralama Saçma sıralama Seçmeli sıralama Sıralama Tarak sıralaması Yığın sıralaması İplik sıralaması İçgözlemle sıralama Sıralama algoritması Yığın Sıralaması'nın rastgele üretilmiş sayıları nasıl sıraladığını gösteren örnek ![]() ![]() Sıralama algoritması, bilgisayar bilimlerinde ya da matematikte kullanılan, verilen bir listenin elemanlarını belirli bir sıraya sokan algoritmadır ![]() ![]() ![]() ![]() Sıralama algoritmaları, tanımı çok yalın olmasına karşın çözümü çok karmaşık olan bir işi gerçekleştirdikleri için, üzerinde en fazla araştırma yapılan bilgisayar bilimi konularından biridir ![]() ![]() ![]() ![]() ![]() Birleştirmeli sıralama'nın rastgele üretilmiş sayıları gösteren noktaları nasıl sıraladığını gösteren örnek Bilgisayar bilimlerinde kullanılan sıralama algoritmaları genellikle aşağıdaki ölçütlere göre sınıflandırılır: Hesaplama karmaşıklığı: Dizideki öğelerin karşılaştırılmasının en iyi, ortalama ve en kötü başarımının dizinin boyutu (n) cinsinden gösterilmiş halidir ![]() ![]() ![]() ![]() Yer Değiştirme Karmaşıklığı (yerinde sıralama algoritmaları için) ![]() Bellek (ve diğer donanım kaynaklarının) Kullanımı: Bazı sıralama algoritmaları dizinin içerdiği öğelerin dizinin saklandığı alanda sıralar ![]() ![]() ![]() Özyineleme: Bazı algoritmalar ya özyinelemeli ya da özyinelemesiz çalışırken, birleştirmeli sıralama gibi bazı algoritmalar iki biçimde de uygulanabilir Kararlılık Kaşılaştırma sıralaması olup olmama: Bir karşılaştırma sıralaması sıralanacak veriyi, bir karşılaştırma işlemi kullanarak, karşılaştırarak inceler ![]() Genel Yöntem: Araya sokma, değiştirme, seçme, birleştirme vb ![]() ![]() ![]() Kararlılık Kararlı sıralama algoritmaları sıralanacak dizinin içinde değerleri birbirine eşit olan öğerlerin birbirlerine göre olan konulmlarını korur ![]() ![]() Dizinin içinde birbirine eşit değerler içeren öğeler birbirlerinden ayırt edilemiyorsa (örneğin sayılar ya da harfler gibi değerler öğenin kendisini oluşturuyor ise) kararlılık bir sorun değildir ![]() ![]() (4, 1) (3, 7) (3, 1) (5, 6) Bu durumda, 2 değişik sonuç mümkündür; ilk çözüm sıralama anahtarlarının değerleri aynı olan öğelerinin sırasını korur, ikincisi ise korumaz: (3, 7) (3, 1) (4, 1) (5, 6) (sıra korunmuş) (3, 1) (3, 7) (4, 1) (5, 6) (sıra değişmiş) Kararsız sıralama algoritmaları sıralama anahtarlarının değerleri aynı olan öğelerin dizi içindeki sırasını değiştirebilir ancak kararlı sıralama algoritmaları asla değiştirmez ![]() ![]() ![]() ![]() Ağaç sıralaması Ağaç sıralaması, bilgisayar bilimlerinde kullanılan, herhangi bir diziden önce bir ikili arama ağacı oluşturup ardından bu ağacın üzerinden geçerek dizinin sıralanmasını sağlayan bir sıralama algoritmasıdır ![]() Basamağa göre sıralama (İngilizcesi: Radix sort) bilgisayar bilimlerinde sayıları basamaklarının üzerinde işlem yaparak sıralayan bir sıralama algoritmasıdır ![]() ![]() Çoğu bilgisayar veri saklamak için ikilik tabandaki sayıların elektronikteki gösterim biçimlerini kullandığı için sayma sayılarının basamaklarını ikilik tabandaki sayılardan oluşan öbekler biçiminde göstermek daha kolaydır ![]() ![]() ![]() Sıralama algoritmaları tarafından işlenen ve kendi sayı değerlerini gösterebildiği gibi başka tür verilerle de eşleştirilebilen sayma sayılarına çoğu zaman "anahtar" denir ![]() ![]() ![]() ![]() En anlamlı basamağa göre sıralama sözcükler ya da aynı uzunluktaki sayılar gibi dizgileri sıralamak için uygun olan sözlükteki sıraya göre sıralar ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#2 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıCüce sıralaması (İngilizcesi: Gnome sort), bilgisayar bilimlerinde kullanılan araya sokmalı sıralamaya benzer bir sıralama algoritmasıdır ![]() ![]() ![]() Sözde Kodu function gnomeSort(a[0 ![]() ![]() i := 1 j := 2 while i < size - 1 if a[i-1] >= a[i] i := j j := j + 1 else swap a[i-1] and a[i] i := i - 1 if i = 0 i := 1 } Algoritmanın Java Uygulaması void gnomeSort(int a[]) { int i = 1; int j = 2; while (i < a ![]() if (a[i - 1] >= a[i]) { i = j; j++; } else { int temp = a[i]; a[i] = a[i - 1]; a[i - 1] = temp; i--; if (i == 0) { i = 1; } } } Eklemeli Sıralama (İngilizcesi: Insertion Sort), bilgisayar bilimlerinde kullanılan ve sıralı diziyi her adımda öğe öğe oluşturan bir sıralama algoritmasıdır ![]() ![]() ![]() Eklemeli Sıralama'nın rastgele üretilmiş sayıları nasıl sıraya dizdiğini gösteren bir örnek ![]() Uygulaması kolaydır ![]() Küçük Veri kümeleri üzerinde kullanıldığında verimlidir ![]() Çoğunluğu zaten sıralanmış olan diziler üzerinde kullanıldığında verimlidir ![]() Karmaşıklığı mathcal{O}(n^2) olan seçmeli sıralama ve kabarcık sıralaması gibi çoğu yalın sıralama algoritmalarından daha verimlidir ![]() Kararlı bir sıralama algoritmasıdır (değeri eşit olan öğelerin asıl listedeki göreceli konumlarını değiştirmez) Sıralanacak diziyi yerinde sıralar, ek bir bellek alanı gerektirmez ![]() Sıralanacak dizinin hepsinin algoritmanın girdisi olmasına gerek yoktur ![]() ![]() İnsanlar herhangi birşeyi (örneğin, iskambil kartları) sıralarken, çoğu durumda eklemeli sıralamaya benzer bir yöntem kullanırlar ![]() Sözde Kodu insertionSort(array A) for i = 1 to length[A-1] do value = A[i] j = i-1 while j >= 0 and A[j] > value A[j + 1] = A[j] j = j-1 A[j+1] = value Güvercin yuvası sıralaması Güvercin yuvası sıralaması, n adet öğeyi N adet "güvercin yuvası" (sıralanacak öğelerin alabileceği olası değerlerin sayısı) ile (Θ(n + N)) karmaşıklığıyla sıralayan bir sıralama algoritmasıdır ![]() ![]() ![]() Güvercin yuvası algoritması aşağıdaki biçimde çalışır: Başlangıçta boş "güvercin yuvalarının" bulunduğu her bir arama anahtarı aralığına bir güvercin yuvası düşecek biçimde bir dizi oluştur ![]() Sıralanacak dizinin üzerinden geçerek bütün öğeleri ilgili güvercin yuvasına yerleştir ![]() Güvercin yuvası disizinin üzerinden sırayla gerçerek boş olmayan bütün yuvalardaki öğeleri asıl diziye aktar ![]() Güvercin yuvası sıralaması hızlı çalışması için gereken durumların nadiren oluşması ve diğer daha esnek ve neredeyse aynı hızda çalışan algoritmaların kullanımı daha kolay olduğu için pek kullanılmaz ![]() ![]() Sözde kodu N adet ayrık elemanı sıralayan güvercin yuvası sıralamasının sözde kodu aşağıdaki gibidir: function pigeonhole_sort(array a[n]) array b[N] var i,j zero_var (b) (* zero out array b *) for i in [0 ![]() ![]() ![]() b[a[i]] := b[a[i]]+1 (* copy the results back to a *) j := 0 for i in [0 ![]() ![]() ![]() repeat b[i] times a[j] := i j := j+1 |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#3 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıHızlı sıralama ![]() Hızlı Sıralama'nın uygulanması sırasındaki davranışı ![]() ![]() Hızlı Sıralama (İngilizcesi: Quicksort) günümüzde yaygın olarak kullanılan bir sıralama algoritmasıdır ![]() ![]() ![]() Tarihi Hızlı Sıralama algoritması 1960 yılında küçük bir İngiliz şirketi olan Elliot Brothers'ta çalışan C ![]() ![]() ![]() ![]() Algoritma Hızlı sıralama algoritması, sıralanacak bir sayı dizisini daha küçük iki parçaya ayırıp oluşan bu küçük parçaların kendi içinde sıralanması mantığıyla çalışır ![]() Algoritmanın adımları aşağıdaki gibidir: Sayı dizisinden herhangi bir sayıyı pivot eleman olarak seç ![]() Sayı dizisini pivottan küçük olan tüm sayılar pivotun önüne, pivottan büyük olan tüm sayılar pivotun arkasına gelecek biçimde düzenle (pivota eşit olan sayılar her iki yana da geçebilir) ![]() ![]() ![]() Pivotun sol ve sağ yanında olmak üzere oluşan iki ayrı küçük sayı dizisi, hızlı sıralama algoritması bu küçük parçalar üzerinde yeniden özyineli olarak çağrılarak sıralanır ![]() Algoritma içinde sayı kalmayan (eleman sayısı sıfır olan) bir alt diziye ulaştığında bu dizinin sıralı olduğunu varsayar ![]() Örnek TEKRARLA Ara index_sol için sortFeld[index_sol] ≥ sortFeld[Pivot] Ara index_sağ için sortFeld[index_sağ] ≤ sortFeld[Pivot] EĞER index_sol ve index_sağ bulundu ise SONRA Değiştir sortFeld[index_sol] ile sortFeld[index_sağ] YOKSA Bir element kaydır SON EĞER Koşul tamamlanıncaya kadar Üstteki algoritmaya göre asagidaki örnek : SORTIERBEISPIEL 1 - Pivot(karşılaştırma) elementini bulmak için : İlkönce harfler sayılır ![]() ![]() toplam çift ise ikiye bölünür ![]() 2 - Bu durumda Pivot element B oluyor ![]() B urada ilk harf olan 'S' son harf olan 'L' ve orta harf olan 'B' karşılaştırılır ![]() İçlerinde ortanca olan değer her zaman orta değerdir ![]() Yani örnek şu şekle dönüşür : SORTIER L EISPIEB 3 - Yukarıdaki algoritma göz önünde bulundurulursa; Kontrol ediliyor : Soldaki element(S) Pivot(L) den büyük mü? ( Evet ) Sağdaki element(B) Pivot(L) den küçük mü? ( Evet ) Eğer iki koşul da doğru ise ilk element(S) ile son element(B) yer değiştirilir ![]() Soldaki element(0) Pivot(L) den büyük mü? ( Evet ) Sağdaki element(E) Pivot(L) den küçük mü? ( Evet ) Eğer iki koşul da doğru ise ilk element(0) ile son element(E) yer değiştirilir ![]() Soldaki element(R) Pivot(L) den büyük mü? ( Evet ) Sağdaki element(I) Pivot(L) den küçük mü? ( Evet ) Eğer iki koşul da doğru ise ilk element(R) ile son element(I) yer değiştirilir ![]() Soldaki element(T) Pivot(L) den büyük mü? ( Evet ) Sağdaki element(P) Pivot(L) den küçük mü? ( Hayır ) Eğer bir koşul yanlış ise soldaki element(T) sabit kalıyor , sağdaki element(P) yi direk sağa yazılır ![]() Soldaki element(T) Pivot(L) den büyük mü? ( Evet ) Sağdaki element(S) Pivot(L) den küçük mü? ( Hayır ) Eğer bir koşul yanlış ise soldaki element(T) sabit kalıyor , sağdaki element(S) yi direk sağa yazılır ![]() Soldaki element(T) Pivot(L) den büyük mü? ( Evet ) Sağdaki element(I) Pivot(L) den küçük mü? ( Evet ) Eğer iki koşul da doğru ise element(T) ile element(I) yer değiştirilir ![]() Soldaki element(E) Pivot(L) den büyük mü? ( Hayır ) Sağdaki element(E) Pivot(L) den küçük mü? ( Evet ) Eğer bir koşul yanlış ise soldaki element(E) sola yazılır , sağdaki element(E) sabit kalıyor ( BEIIIER L ETSPROS ) Soldaki element(R) Pivot(L) den büyük mü? ( Evet ) Sağdaki element(E) Pivot(L) den küçük mü? ( Evet ) Eğer bir koşul da doğru ise soldaki element(R) ile sağdaki element(E) sabit kalıyor ( BEIIIEE L RTSPROS ) Son aşama Soldaki element(R) Pivot(L) den büyük mü? ( Evet ) Sağdaki element(E) Pivot(L) den küçük mü? ( Evet ) Eğer bir koşul yanlış ise soldaki element(R) sola yazılır , sağdaki element(E) sabit kalıyor ( BEIIIEE L RTSPROS ) B - E - I - I - I - E - E - L - R - T - S - P - R - O - S Aynı işlemleri sağdaki ve soldaki bölümlere ayrı ayrı yapılır ![]() Sonuç şöyle : B E E E I I I L O P R R S S T Sözde Kodu Algoritmanın yalın bir sözde kod olarak gösterimi aşağıdaki gibidir: function quicksort(array) var list less, equal, greater if length(array) ≤ 1 return array select a pivot value pivot from array for each x in array if x < pivot then append x to less if x = pivot then append x to equal if x > pivot then append x to greater return concatenate(quicksort(less), equal, quicksort(greater)) |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#4 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıKabarcık sıralaması ![]() Kabarcık sıralaması'nın rastgele üretilmiş sayıları sıraladığını gösteren bir örnek Kabarcık Sıralaması, bilgisayar bilimlerinde kullanılan yalın bir sıralama algoritmasıdır ![]() ![]() ![]() ![]() Başlangıçta yer yer değiştirme sıralaması olarak adlandırılan kabarcık sıralaması, dizi içindeki büyük elemanların algoritmanın her adımında dizinin sonuna doğru doğrusal olarak ilerlemesini sağlar ![]() ![]() İnceleme Kabarcık sıralaması dizinin başından başlar ve dizi elemanlarını sırayla seçer ![]() ![]() ![]() ![]() Algoritmanın Karmaşıklığı Kabarcık sıralama algoritmasının ortalama ve en kötü durumdaki karmaşıklığı 'dir ![]() ![]() Algoritmanın Adım Adım İşleyişi İçeriği "5 1 4 2 8" olan bir dizi kabarcık sıralaması ile en küçükten en büyüğe doğru aşağıdaki biçimde sıralanır ![]() ![]() Birinci Geçiş: ( 5 1 4 2 8 ) o ( 1 5 4 2 8 ) Burada algoritma ilk iki elemanı karşılaştırır ve yerlerini değiştirir ![]() ( 1 5 4 2 8 ) o ( 1 4 5 2 8 ) ( 1 4 5 2 8 ) o ( 1 4 2 5 8 ) ( 1 4 2 5 8 ) o ( 1 4 2 5 8 ) Burada elemanlar zaten sıralı olduğu için algoritma yerlerini değiştirmez ![]() İkinci Geçiş: ( 1 4 2 5 8 ) o ( 1 4 2 5 8 ) ( 1 4 2 5 8 ) o ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) o ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) o ( 1 2 4 5 8 ) Artık dizi sıralıdır ancak algoritma işlemin bittiğini bilmemektedir ![]() ![]() Üçüncü Geçiş: ( 1 2 4 5 8 ) o ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) o ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) o ( 1 2 4 5 8 ) ( 1 2 4 5 8 ) o ( 1 2 4 5 8 ) Sonuç olarak dizi sıralanmıştır ve algoritma sonlanır ![]() Sözde Kodu Algoritmanın yalın bir sözde kod olarak gösterimi aşağıdaki gibidir: procedure bubbleSort( A : sıralanabilir öğe dizisi ) defined as: do swapped := false for each i in 0 to length( A ) - 2 do: if A[ i ] > A[ i + 1 ] then swap( A[ i ], A[ i + 1 ] ) swapped := true end if end for while swapped end procedure </gösterilebilir: procedure bubbleSort( A : sıralanabilir öğe dizisi ) defined as: for each i in 1 to length(A) do: for each j in length(A) downto i + 1 do: if A[ j -1 ] > A[ j ] then swap( A[ j - 1], A[ j ] ) end if end for end for end procedure |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#5 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıKabuk sıralaması (İngilizcesi: Shell sort), bilgisayar bilimlerinde kullanılan bir sıralama algoritmasıdır ![]() Eklemeli sıralama, sıralanacak dizi zaten büyük oranda sıralıysa daha verimli çalışır ![]() Eklemeli sıralama, dizideki öğeleri her adımda yalnızca bir sonraki konuma aktardığından verimsizdir ![]() Algoritmanın Geçmişi Kabuk sıralaması algoritmasının adı algoritmayı bulan kişi olan Donald Shell'den gelmektedir ![]() ![]() Uygulamalar C/C++ dilinde yazılmış kabuk sıralaması Aşağıda C/C++ dilinde yazılmış, bir sayı dizisini kabuk sıralaması algoritmasını kullanarak sıralayan bir program verilmiştir ![]() /* SHELL SORT Written by erengencturk ![]() */ #include <stdio ![]() #define ELEMENTS 6 void shellsort(int A[],int max) { int stop,swap,limit,temp,k; int x=(int)(max/2)-1; while(x>0) { stop=0; limit=max-x; while(stop==0) { swap=0; for(k=0;k<limit;k++) { if(A[k]>A[k+x]) { temp=A[k]; A[k]=A[k+x]; A[k+x]=temp; swap=k; } } limit=swap-x; if(swap==0) stop=1; } x=(int)(x/2); } } int main() { int i; int X[ELEMENTS]={5,2,4,6,1,3}; printf("Unsorted Array: "); for(i=0;i<ELEMENTS;i++) printf("%d ",X[i]); shellsort(X,ELEMENTS); printf(" SORTED ARRAY "); for(i=0;i<ELEMENTS;i++) printf("%d ",X[i]); } Java dilinde yazılmış kabuk sıralaması public static void shellSort(int[] a) { for (int increment = a ![]() increment = (increment == 2 ? 1 : (int) Math ![]() ![]() for (int i = increment; i < a ![]() int temp = a[i]; for (int j = i; j >= increment && a[j - increment] > temp; j -= increment){ a[j] = a[j - increment]; a[j - increment] = temp; } } } } Python dilinde yazılmış kabuk sıralaması def shellsort(a): def increment_generator(a): h = len(a) while h != 1: if h == 2: h = 1 else: h = 5*h//11 yield h for increment in increment_generator(a): for i in xrange(increment, len(a)): for j in xrange(i, increment-1, -increment): if a[j - increment] < a[j]: break a[j], a[j - increment] = a[j - increment], a[j] return a |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#6 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıKokteyl sıralaması Kokteyl sıralaması, bilgisayar bilimlerinde kabarcık sıralaması algoritmasına benzer bir sıralama algoritmasıdır ![]() ![]() ![]() Sözde kodu Kokteyl sıralamasının en yalın biçimi her defasında listenin tamamının üzerinden geçer: procedure cocktailSort( A : list of sortable items ) defined as: do swapped := false for each i in 0 to length( A ) - 2 do: if A[ i ] > A[ i + 1 ] then // ardışık iki öğenin doğru sırada olup olmadığına bak order swap( A[ i ], A[ i + 1 ] ) // iki öğenin yerlerini değiştir swapped := true end if end for if swapped = false then // eğer değişiklik yapılmadıysa dıştaki döngüden çıkabiliriz ![]() break do-while loop end if swapped := false for each i in length( A ) - 2 to 0 do: if A[ i ] > A[ i + 1 ] then swap( A[ i ], A[ i + 1 ] ) swapped := true end if end for while swapped // hiçbir öğe yer değiştirmediyse liste sıralanmıştır end procedure |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#7 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıKova Sıralaması Elemanlar önce kovalar arasında dağıtılır ![]() Daha sonra her kovadaki elemanlar kendi içinde sıralanır Kova Sıralaması (ya da sepet sıralaması), sıralanacak bir diziyi parçalara ayırarak sınırlı sayıdaki kovalara (ya da sepetlere) atan bir sıralama algoritmasıdır ![]() ![]() Kova sıralaması aşağıdaki biçimde çalışır: Başlangıçta boş olan bir "kovalar" dizisi oluştur ![]() Asıl dizinin üzerinden geçerek her öğeyi ilgili aralığa denk gelen kovaya at ![]() Boş olmayan bütün kovaları sırala ![]() Boş olmayan kovalardaki bütün öğeleri yeniden diziye al ![]() Sözde kodu function bucket-sort(array, n) is buckets ← new array of n empty lists for i = 0 to (length(array)-1) do insert array[i] into buckets[msbits(array[i], k)] for i = 0 to n - 1 do next-sort(buckets[i]) return the concatenation of buckets[0], ![]() ![]() ![]() |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#8 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıKütüphane Sıralaması Kütüphane Sıralaması, ya da diğer bir deyişle aralıklı eklemeli sıralama, eklemeli sıralama algoritmasını art arda yapılan eklemeleri dizideki boşlukları kullanıp hızlandırarak kullanan bir sıralama algoritmasıdır ![]() Bir kütüphane görevlisinin bir raftaki bütün kitapları A harfiyle başlayanlar sol tarafta kalarak sağa doğru kitapların arasında boşluk kalmayacak biçimde alfabetik sıraya dizmek istediğini varsayalım ![]() ![]() ![]() ![]() ![]() Algoritma Michael A ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#9 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıSabır sıralaması Sabır sıralaması bilgisayar bilimlerinde kullanılan ve bir kâğıt oyununa dayanan bir sıralama algoritmasıdır ![]() Kağıt oyunu Oyun, 1, 2, ![]() ![]() ![]() ![]() Başlangıçta hiçbir kâğıt yığını yoktur ![]() ![]() Oynanan her yeni kart ya en üstte kendisinden daha büyük bir kart bulunan kâğıt yığının en üstüne ya da masadaki tüm yığınların en sağına yeni bir yığın oluşturmak üzere yerleştirilir ![]() Dağıtılacak kâğıt kalmadığı zaman oyun biter ![]() Oyunun amacı oyunu olabilecek en az sayıda kâğıt yığınıyla bitirmektir ![]() |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#10 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıSabır sıralaması Sabır sıralaması bilgisayar bilimlerinde kullanılan ve bir kâğıt oyununa dayanan bir sıralama algoritmasıdır ![]() Kağıt oyunu Oyun, 1, 2, ![]() ![]() ![]() ![]() Başlangıçta hiçbir kâğıt yığını yoktur ![]() ![]() Oynanan her yeni kart ya en üstte kendisinden daha büyük bir kart bulunan kâğıt yığının en üstüne ya da masadaki tüm yığınların en sağına yeni bir yığın oluşturmak üzere yerleştirilir ![]() Dağıtılacak kâğıt kalmadığı zaman oyun biter ![]() Oyunun amacı oyunu olabilecek en az sayıda kâğıt yığınıyla bitirmektir ![]() |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#11 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıSayarak sıralama Sayarak sıralama bilgisayar bilimlerinde kullanılan ve kova sıralaması gibi sıralanacak dizinin içindeki değerlerin aralığının bilinmesi durumunda kullanılabilen bir sıralama algoritmasıdır ![]() ![]() ![]() ![]() ![]() C++ ile uygulaması Aşağıdaki program sayarak sıralama algoritmasının C++ dilinde yazılmış bir uygulamasını göstermektedir ![]() /// countingSort - değerleri tutan bir diziyi sıralamak için ![]() /// /// Algoritmanın verimli çalışması için sıralacak /// değerlerin aralığı sıralanacak öğelerin sayısından /// çok daha büyük olmamalıdır ![]() /// /// param nums - girdi - sıralanacak değerler dizisi /// param size - girdi - dizideki öğelerin sayısı /// void counting_sort(int *nums, int size) { // search for the minimum and maximum values in the input int i, min = nums[0], max = min; for(i = 1; i < size; ++i) { if (nums[i] < min) min = nums[i]; else if (nums[i] > max) max = nums[i]; } // create a counting array, counts, with a member for // each possible discrete value in the input ![]() // initialize all counts to 0 ![]() int distinct_element_count = max - min + 1; int[] counts = new int[distinct_element_count]; for(i=0; i<distinct_element_count; ++i) counts[i] = 0; // accumulate the counts - the result is that counts will hold // the offset into the sorted array for the value associated with that index for(i=0; i<size; ++i) ++counts[ nums[i] - min ]; // store the elements in the array int j=0; for(i=min; i<=max; i++) for(int z=0; z<counts[i-min]; z++) nums[j++] = i; delete[] counts; |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#12 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıSaçma sıralama Saçma sıralama (ya da rastgele sıralama) bilgisayar bilimlerinde yalnızca eğitim amaçlı olarak kullanılan verimsiz bir sıralama algoritmasıdır ![]() ![]() ![]() Uygulama Sözde kodu: while not InOrder(deck) do Shuffle(deck); Java public int[] BogoSort(int[] numbers) { Random rnd = new Random(); while(true) { boolean sorted = true; for(int i = 0; i < numbers ![]() if(numbers[i] > numbers[i+1]) sorted = false; if (sorted) return numbers; for(int i = numbers ![]() { int rand = rnd ![]() int temp = numbers[i]; numbers[i] = numbers[rand]; numbers[rand] = temp; } } } Benzer algoritmalar Rastgele değiştirmeli sıralama Rastgele değiştirmeli sıralama, rastgele sayı seçmeye dayalı, saçma sıralamaya benzer bir sıralama algoritmasıdır ![]() ![]() ![]() |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#13 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıSeçmeli Sıralama Seçmeli Sıralama, bilgisayar bilimlerinde kullanılan karmaşıklığı bir sıralama algoritmasıdır ![]() olduğu için büyük listeler üzerinde kullanıldığında verim sağlamaz ve genel olarak benzeri olan eklemeli sıralamadan daha başarısızdır ![]() ![]() ![]() Seçmeli sıralama algoritması ![]() Seçmeli Sıralama'nın nasıl çalıştığını gösteren görüntü Yöntem Seçmeli Sıralama'nın nasıl çalıştığını gösteren görüntü Algoritma aşağıdaki gibi çalışır: Listedeki en küçük değerli öğeyi bul ![]() İlk konumdaki öğeyle bulunan en küçük değerli öğenin yerini değiştir ![]() Yukarıdaki adımları listenin ilk elemanından sonrası için (ikinci elemandan başlayarak) yinele ![]() Sözde Kodu A sıralanacak öğeler kümesi, n ise A'daki öğe sayısıdır ![]() ![]() for i ← 0 to n-2 do min ← i for j ← (i + 1) to n-1 do if A[j] < A[min] min ← j swap A[i] and A[min] Seçmeli Sıralama Algoritmasının Örnek Kodu public int[] secmeliSiralama(int[] dizi) { int enkucuk, yedek; for (int i = 0; i < dizi ![]() { enkucuk = i; for (int j = i + 1; j < dizi ![]() if (dizi[j] < dizi[enkucuk]) enkucuk = j; if (enkucuk != i) { yedek = dizi[i]; dizi[i] = dizi[enkucuk]; dizi[enkucuk] = yedek; } } return dizi; ![]() 6 elemanlı içeriği karışık olarak verilmiş bir bir sayı dizisinin Seçmeli Sıralama algoritması kullanılarak nasıl küçükten-büyüğe doğru sıralandığını göstermektedir ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#14 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıSıralama Sıralama bir dizi elemanı, belirli bir özelliğine göre sıraya dizme işlemine verilen addır ![]() ![]() Karışık halde: 9 4 2 8 3 1 5 6 7 Sıraya dizilmiş: 1 2 3 4 5 6 7 8 9 Sıralama, genellikle indekslerde, ansiklopedilerde kullanılır ![]() ![]() Tarrak Sıralaması Tarrak Sıralaması, ilk defa 1991 yılının Nisan ayında Stephen Lacey ve Richard Box tarafından Byte dergisinde duyurulmuş yalın bir sıralama algoritmasıdır ![]() ![]() ![]() ![]() Kabarcık sıralaması algoritmasında iki öğe karşılaştırıldığında aralarındaki mesafe her zaman 1'dir ![]() ![]() ![]() ![]() Sözde Kodu function combsort11(array input) gap := input ![]() loop until gap <= 1 or swaps = 0 //yeni bir tarama için aralığın boyutunu güncelle if gap > 1 gap := gap / 1 ![]() if gap = 10 or gap = 9 gap := 11 end if end if i := 0 swaps := 0 // Açıklama için kabarcık sıralamasına bakınız // giriş listesinin üzerinden tek bir "tarama" loop until i + gap >= array ![]() if array[i] > array[i+gap] swap(array[i], array[i+gap]) swaps := 1 // Aritmetik taşma düzeltmesi için end if i := i + 1 end loop end loop end function |
![]() |
![]() |
![]() |
Sıralama Algoritmaları |
![]() |
![]() |
#15 |
Prof. Dr. Sinsi
|
![]() Sıralama AlgoritmalarıYığın Sıralaması (İngilizcesi: Heapsort), bilgisayar bilimlerinde kullanılan karşılaştırmaya dayalı bir sıralama algoritmasıdır ![]() ![]() ![]() Sözde Kodu Aşağıda yığın sıralaması algoritmasının sözde kodu verilmiştir ![]() ![]() function heapSort(a, count) is input: an unordered array a of length count (first place a in max-heap order) heapify(a, count) end := count - 1 while end > 0 do (swap the root(maximum value) of the heap with the last element of the heap) swap(a[end], a[0]) (decrease the size of the heap by one so that the previous max value will stay in its proper placement) end := end - 1 (put the heap back in max-heap order) siftDown(a, 0, end) function heapify(a,count) is (start is assigned the index in a of the last parent node) start := (count - 1) / 2 while start ≥ 0 do (sift down the node at index start to the proper place such that all nodes below the start index are in heap order) siftDown(a, start, count-1) start := start - 1 (after sifting down the root all nodes/elements are in heap order) function siftDown(a, start, end) is input: end represents the limit of how far down the heap to sift ![]() root := start while root * 2 + 1 ≤ end do (While the root has at least one child) child := root * 2 + 1 (root*2+1 points to the left child) (If the child has a sibling and the child's value is less than its sibling's ![]() ![]() ![]() if child < end and a[child] < a[child + 1] then child := child + 1 ( ![]() ![]() ![]() if a[root] < a[child] then (out of max-heap order) swap(a[root], a[child]) root := child (repeat to continue sifting down the child now) else return heapify fonksiyonu alttan üste doğru bir yığın oluşturmak için kullanılırken yığın özelliği kazandırılmak için öğeler aşağıya doğru incelenir ![]() ![]() ![]() function heapify(a,count) is (end is assigned the index of the first (left) child of the root) end := 1 while end < count (sift up the node at index end to the proper place such that all nodes above the end index are in heap order) siftUp(a, 0, end) end := end + 1 (after sifting up the last node all nodes are in heap order) function siftUp(a, start, end) is input: start represents the limit of how far up the heap to sift ![]() end is the node to sift up ![]() child := end while child > start parent := ⌊(child - 1) ÷ 2⌋ if a[parent] < a[child] then (out of max-heap order) swap(a[parent], a[child]) child := parent (repeat to continue sifting up the parent now) else return |
![]() |
![]() |
|