ELN1002 BİLGİSAYAR PROGRAMLAMA 2 SIRALAMA ALGORİTMALARI Sunu Planı Büyük O Notasyonu Kabarcık Sıralama (Bubble Sort) Hızlı Sıralama (Quick Sort) Seçimli Sıralama (Selection Sort) Eklemeli Sıralama (Insertion Sort) Birleştirmeli Sıralama (Merge Sort) 1
Büyük O Notasyonu Bir dizinin ilk elemanı ile ikinci elemanını birbirleriyle kıyaslayan bir algoritma düşünelim: 10 elemanlı bir dizi için kaç kıyaslama gerekir? --- 1 1000 elemanlı bir dizi için kaç kıyaslama gerekir? --- 1 O(1) notasyonu: Eğer algoritmanın içindeki işlem sayısı, dizinin eleman sayısından bağımsızsa, algoritma sabit çalışma süresine sahiptir, yani birinci derecedendir. O(1) algoritmada tek bir kıyaslama olduğunu göstermez, algoritmanın, çalışma zamanının çalıştığı diziyle birlikte artmadığını gösterir. Büyük O Notasyonu n elemanlı bir dizinin ilk elemanının dizi içindeki herhangi bir elemana eşit olup olmadığını test eden bir algoritma, en çok n-1 kıyaslamaya ihtiyaç duyacaktır. 10 elemanlı bir dizi için en çok kaç kıyaslama gerekir? --- 9 1000 elemanlı bir dizi için en çok kaç kıyaslama gerekir? --- 999 n büyüdükçe, (n-1) ifadesindeki n daha baskın hale gelecektir ve -1 anlamsızlaşacaktır. Büyük O notasyonu, bu baskın terimleri açığa çıkarıp, anlamsızları kullanmaz. O(n), algoritmanın, doğrusal çalışma zamanına sahip olduğunu göstermektedir. Yani, algoritmanın çalışma süresi, çalıştığı dizinin eleman sayısıyla doğru orantılı olarak değişecektir. O(n) basitçe n. derece olarak da adlandırılır. 2
Büyük O Notasyonu n elemanlı bir dizinin herhangi bir elemanının dizi içindeki herhangi başka bir elemana eşit olup olmadığını test eden bir algoritma düşünelim. Dizinin ilk elemanının dizinin diğer elemanlarıyla kıyaslanması (n-1) kıyaslama Dizinin ikinci elemanının dizinin diğer elemanlarıyla kıyaslanması (n-2) kıyaslama Dizinin üçünü elemanının dizinin diğer elemanlarıyla kıyaslanması (n-3) kıyaslama Toplam kıyaslama sayısı (n-1) + (n-2) + (n-3) + 2 + 1 => n 2 /2 n/2 kıyaslama Burada n yani dizi elemanı sayısı arttıkça n 2 terimi baskınlaşır ve n terimi anlamsızlaşır. Ayrıca Büyük O notasyonu yine n 2 aydınlatır ve n 2 /2 terimini bırakır. Büyük O notasyonunda sabit elemanlar ihmal edilir. Büyük O Notasyonu Büyük O notasyonu, bir algoritmanın çalışma süresinin, üzerinde çalıştığı dizi elemanı sayısıyla birlikte nasıl değiştiğine açıklık getirmektedir. Bir algoritmanın n 2 kıyaslamaya ihtiyaç duyduğunu düşünelim. 4 elemanlı bir dizi için 16 kıyaslamaya ihtiyaç olacaktır. 8 elemanlı bir dizi için ise 64 kıyaslamaya ihtiyaç olacaktır. Bu algoritmayla, dizi elemanlarını iki katına çıkarmak, kıyaslama sayısını dört katına çıkarmaktadır. Bu algoritmaların çalışma süreleri dizi eleman sayısının karesiyle orantılıdır ve O(n 2 ) olarak gösterilir. O(n 2 ) kuadratik (dört katlı- quadratic) çalışma zamanı olarak değerlendirilir ve basitçe n-kare derece olarak adlandırılır. 3
Büyük O Notasyonu n küçük olduğu sürece, O(n 2 ) tipindeki algoritmalar çalışma zamanı açısından problem oluşturmayacaktır. Fakat n arttıkça performanstaki düşme fark edilir hale gelecektir. 1.000.000 elemanlı bir dizi üzerinde çalışan O(n 2 ) tipinde bir algoritma trilyon seviyesinde işlem (ki bunlarda çalışmak için birkaç makine döngüsüne ihtiyaç duyar) demektir ki bu da programın saatlerce çalışması demektir. O(n 2 ) algoritmaları, genelde oluşturulması basit olan algoritmalardır. Daha verimli veya zamanı daha iyi kullanan algoritmalarsa, üzerinde düşünülmesi gereken ve oluşturulması zor olan algoritmalardır. Kabarcık Sıralama (Bubble Sort) Kabarcık sıralama, son derece basit fakat verimsiz bir sıralama algoritmasıdır. Adımları şu şekildedir: Dizinin tüm elemanlarını sırayla ele alır. Ele aldığı elemanla kendisinden sonraki elemanı karşılaştırır. Ele aldığı eleman bir sonraki elemandan büyükse yerlerini değiştirir, küçükse olduğu gibi bırakır. Bir sonraki elemana geçer. İşlem (n-1) kere tekrarlanır. 4
Kabarcık Sıralama 34 56 4 10 77 51 93 30 5 52 39 34 56 4 10 77 51 93 30 5 52 39 34 4 56 10 77 51 93 30 5 52 39 34 4 10 56 77 51 93 30 5 52 39 34 4 10 56 77 51 93 30 5 52 39 34 4 10 56 51 77 93 30 5 52 39 5
Kabarcık Sıralama - O Seçimli sıralama algoritması, O(n 2 ) tipinde bir algoritmadır. Bu algoritma, iki for döngüsüne sahiptir. Dıştaki döngü, işlemin (n-1) kadar tekrarlanmasını sağlar. İçteki döngü, (n-1) kıyaslama yapar. Seçimli Sıralama (Selection Sort) Seçimli sıralama, basit fakat verimsiz bir sıralama algoritmasıdır. Adımları şu şekildedir: Algoritmanın ilk iterasyonu dizideki en küçük elemanı bulur ve ilk elemanla yerini değiştirir. Algoritmanın ikinci iterasyonu, ikinci elemandan itibaren en küçük elemanı bulur ve ikinci elemanla yerini değiştirir. Algoritma sondan bir önceki elemanla son elemanın kıyaslanmasına kadar bu şekilde devam eder. i. iterasyondan sonra, dizinin en küçük i adet elemanı, artan şekilde dizinin ilk i sırasını kaplamış olacaktır. 6
Seçimli Sıralama (Selection Sort) 34 56 4 10 77 51 93 30 5 52 39 4 56 34 10 77 51 93 30 5 52 39 4 5 34 10 77 51 93 30 56 52 39 4 5 10 34 77 51 93 30 56 52 39 4 5 10 30 77 51 93 34 56 52 39 10. iterasyondan sonra 4 5 10 30 34 39 51 52 56 77 93 7
8
Seçimli Sıralama - O Seçimli sıralama algoritması, O(n 2 ) tipinde bir algoritmadır. Bu algoritma, iki for döngüsüne sahiptir. Dıştaki döngü, ilk (n-1) eleman üzerinde işlem yapar, bulunan en küçük elemanı sırasına yerleştirir. İçteki döngü, dizinin kalan elemanları üzerinde, en küçük elemanın aranması işlemini gerçekleştirir. İlk aşamada, (n-1) iterasyon gerçekleştirilir, ikinci aşamada (n-2) iterasyon gerçekleştirilir, ve bu şekilde O(n 2 ) tipinde bir yapı oluşur. 9
Eklemeli Sıralama (Insertion Sort) Eklemeli sıralama başka bir basit fakat verimsiz sıralama algoritmasıdır. İşleyişi şu şekildedir: Algoritmanın ilk iterasyonu, dizinin ikinci elemanını alır, eğer birinci elemandan küçükse, birinciyle yer değiştirir. İkinci iterasyon, üçüncü elemana bakar, ilk elemanın durumuna göre doğru yerine yerleştirir, böylece üç elemanda sıralanmış olur. Algoritmanın i. İterasyonunda, ilk eleman doğru şekilde sıralanmış olacaktır. Eklemeli Sıralama (Insertion Sort) 34 56 4 10 77 51 93 30 5 52 39 34 56 4 10 77 51 93 30 5 52 39 34 56 56 10 77 51 93 30 5 52 39 4 Geçici Değişken 34 34 56 10 77 51 93 30 5 52 39 4 34 56 10 77 51 93 30 5 52 39 10
11
12
Eklemeli Sıralama - O Eklemeli sıralama algoritması, O(n 2 ) tipinde bir algoritmadır. Bu algoritma, aynı seçimli algoritma gibi iki döngüye sahiptir. for döngüsü, (n-1) kere çalışır, elemanı sırlanamış elemanlar içindeki doğru yerine yerleştirir. while döngüsü, dizinin kalan elemanları üzerinde işlemini gerçekleştirir. İlk aşamada, (n-1) iterasyon gerçekleştirilir, ikinci aşamada (n-2) iterasyon gerçekleştirilir, ve bu şekilde O(n 2 ) tipinde bir yapı oluşur. Birleştirmeli Sıralama (Merge Sort) Birleştirmeli algoritma, verimli bir sıralama algoritmasıdır, fakat kavramsal olarak diğerlerine göre daha karmaşıktır. Birleştirmeli sıralama algoritması, diziyi eşit uzunluklu iki diziye böler, her diziyi kendi içinde sıralar ve onları tek bir dizide birleştirir. Dizi eleman sayısı tek sayıysa, bölünmüş dizilerden birinin eleman sayısı diğerinden bir fazla olmalıdır. Yinelemeli (Rekürsif) birleştirmeli sıralama algoritmasının işleyişi şu şekildedir: Temel durum tek elemanlı bir dizidir. Tek elemanlı bir dizinin, sıralanmak gibi bir problemi yoktur, böylece tek elemana indirgenince fonksiyon hemen geriye döner. Yineleme adımı, iki veya daha fazla elemana sahip her diziyi iki eşit sayıda elemana sahip alt dizilere böler, yinelemeli olarak her alt diziyi sıralar, ve onları daha büyük, sıralı bir dizi şeklinde birleştirir. 13
Birleştirmeli Sıralama (Merge Sort) 34 56 4 10 77 51 93 30 5 52 34 56 4 10 77 51 93 30 5 52 4 10 34 56 77 5 30 51 52 93 4 5 10 30 34 51 52 56 77 93 14
15
16
Birleştirmeli Sıralama - O Birleştirmeli sıralama, seçimli ve yerleştirmeli sıralamalara göre çok daha verimlidir. AltDiziyiSırala fonksiyonuna ilk çağrıya (yinelemeli olmayan) bakalım. Bu fonksiyon, ilk dizinin yarısı büyüklüğündeki iki alt diziye yapılan iki adet AltDiziyiSirala yinelemeli fonksiyon ve tek bir merge fonksiyon çağrısıyla sonlanır. Birlestir fonksiyonuna yapılan bu çağrı, en kötü koşulda ilk diziyi doldurmak için (n-1) kıyaslamaya ihtiyaç duyacaktır, bu da O(n) yapısıdır. AltDiziyiSirala fonksiyonuna yapılan iki çağrı, her biri ilk dizininin dörtte biri eleman sayısına sahip dizilerle dört adet yinelemeli AltDiziyiSirala çağrısıyla sonuçlanacaktır, dolayısıyla birlestir fonksiyonuna yapılan iki çağrı daha. 17
Birleştirmeli Sıralama - O Bu iki adet birlestir fonksiyonuna yapılan iki çağrıda, en kötü koşulda, (n/2-1) kıyaslamaya ihtiyaç duyacaktır, bu da toplam kıyaslamalar açısından O(n) sonucunu oluşturacak. Bu süreç, her AltDiziyiSirala fonksiyonu, iki yeni AltDiziyiSirala ve bir yeni birlestir fonksiyonunu çağırarak, algoritma diziyi tek elemanlı diziler haline parçalayıncaya kadar devam eder. Her seviyede, dizi ikiye bölünür, böylece dizinin boyutunu ikiye katlamak bir seviye daha gerektirmiş olur. Bu logaritmik bir yapıdır ve log 2 n seviyeyle sonuçlanır. Bunun sonucu olarak toplam verimlilik O(n log n) olarak elde edilir. Hızlı Sıralama (Quick Sort) 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ı pivot eleman olarak seçilir. Sayı dizisi, 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 tekrar düzenlenir (pivota eşit olan sayılar her iki yana da geçebilir). Bu bölümlendirme işleminden sonra eleman sıralanmış son dizide olması gerektiği yere gelir. Algoritmanın bu aşamasına bölümlendirme aşaması denir. Pivotun sol ve sağ yanında olmak üzere oluşan iki ayrı küçük sayı dizisi üzerinde, hızlı sıralama algoritması özyinelemeli olarak yeniden çağrılı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. 18
Hızlı Sıralama (Quick Sort) 34 56 4 10 77 51 93 30 5 52 34 56 4 5 77 51 93 30 10 52 10 56 4 5 77 51 93 30 34 52 5 56 4 10 77 51 93 30 34 52 5 10 4 56 77 51 93 30 34 52 5 4 10 56 77 51 93 30 34 52 10 un gerçek pozisyonu 19
20
Hızlı Sıralama - O Hızlı sıralama algoritması n adet sayıyı, ortalama bir durumda O(nlog n) karmaşıklığıyla, en kötü durumda ise O(n 2 )karmaşıklığıyla sıralar. 21