HIZLI SIRALAMA ALGORİTMALARI(QUICK SORT) www.ogrenciyiz.net
VERİ YAPILARI Sayısal ortamdaki bilgilerin veya verilerin belirli bir anahtar sözcüğe göre belirli bir anlamda sıralı erişimini sağlayan düzenlemedir. Temel Sıralama Algoritmaları; Araya Sokma(İnsertion) Seçmeli(Selection) Kabarcık(Bubble) Birleşmeli(Marge) Kümeleme(Heap) Hızlı(quick) Sıralama www.ogrenciyiz.net
Hızlı(Quick) Sıralama; Böl ve yönet yaklaşımına dayanır ve dizi belirli sınır değerine göre iki alt diziye ayrılır. İkiye ayırma işlemi, bu sınır sayısından küçük elamanlar bir tarafa , büyük elemanlar diğer tarafa toparlanarak yapılır. www.ogrenciyiz.net
Bir liste oluşturmadan önce bu listeyi quick sort yöntemiyle nasıl çözeceğimizi öğrenelim . Önce listeden bir isim seçerek bu isme pivot elemanı adını verelim. Amacımız pivot elemanın listedeki doğru yerini bulmak ve onu oraya koymak olsun. Pivotun doğru yerini bulmak için listeyi iki daha küçük listeye bölelim. www.ogrenciyiz.net
Bu listelerden birincisi pivot elamanından önce yer alan isimler listesi olsun, ikincisi de pivottan sonra gelen elemanlar listesi olsun. Sonuç olarak, pivot elemanının doğru yeri, bu iki liste arasında yer alacaktır. www.ogrenciyiz.net
Listemizi iki alt satıra bölmek için adına imleç(pointer) denen yeri değişebilen oklar kullanacağız. Bu oklardan birini pivot elemandan sonraki satıra ikincisini de son satıra koyalım. Geliştirdiğimiz algoritma imleçleri birbirine yaklaştırırken aşağıdaki çıkarımı(assertion) sağlasın: Çıkarım 1: Üsteki imlecin (A) üstünde yer alan isimler alfabetik olarak sıralamada pivot elemanından daha küçüktür. Alttaki imleçte (B) daha aşağıda yer alan isimler ise alfabetik sıralamada pivot elamanından daha büyüktür. www.ogrenciyiz.net
Elimizde şöyle bir isim listesi olsun: Jale, Bülent, Ali, Tolga, Canan, Banu, Gül, Ceyda, Sema, Kemal. Bu listedeki ilk elemanı pivot eleman olarak seçer, listenin ikinci ve son elemanlarına sırası ile A ve B imleçlerini koyarak algoritmayı başlatalım. www.ogrenciyiz.net
Jale (pivot) A Bülent Ali Tolga Canan Banu Gül Ceyda Sema B Kemal www.ogrenciyiz.net
Bir sonraki adımda B imlecini listenin yukarılarına doğru hareket ettirelim. Her seferinde de en altta kalan isimlerin pivot elemandan büyük olup olmadığını kontrol edelim. Bu adımda pivot elemandan küçük ya da ona eşit bir isme gelince, B imlecini o elamanın bulunduğu satıra yerleştiririz. İmleç en fazla pivot elemana kadar ilerleyecek ve orada duracaktır.Bu isme eriştiğimiz zaman artık B imlecini hareket ettirmekten vazgeçeriz. Yukarıdaki örnekte B imleci Ceydada duracaktır: Jale (pivot) A Bülent Ali Tolga Canan Banu Gül B Ceyda Sema Kemal www.ogrenciyiz.net
Şimdi de A imlecini aşağıya doğru kaydıralım Şimdi de A imlecini aşağıya doğru kaydıralım. Aşağıya doğru indikçe isimleri pivot elemanı ile karlaştırarak kaydırma işlemini isimler pivot elemanından daha küçük veya ona eşit olduğu sürece devam ettirelim. Olabilecek en son şey iki imlecin birbirini geçmesidir. Bu durum ise pivot elemanın B imlecinin bulunduğu yerde olması gerektiğini gösterir. Örnekte ilk hareketler iki imleci de tıkamıştır. Bu koşullar sağlandığı zaman imleçleri hareket ettirirsek birinci çıkarımı ihlal etmiş oluruz. Yukarıdaki imleci aşağı kaydırarak listeyi şu hale getirmiş oluruz: www.ogrenciyiz.net
Jale (pivot) Pivottan büyük yada Bülent ona eşit isimler Ali A Tolga Canan Banu Gül B Ceyda Pivottan büyük isimler Sema Kemal www.ogrenciyiz.net
Bu durumda kilit (deadlock) adı verilir Bu durumda kilit (deadlock) adı verilir. Kilidin bir şekilde açılması gerekir. Bunun yolu ise imleçlerin gösterdiği isimleri birbirleri ile değiştirmektir. Ancak bundan sonra, çıkarımızı ihlal etmeden imleçleri tekrar hareket ettirebiliriz. Bu değiştirmeden sonra yeni listemiz şöyle olacaktır: Jale (pivot) Pivottan büyük yada Bülent ona eşit isimler Ali A Ceyda Canan Banu Gül B Tolga Pivottan büyük isimler Sema Kemal www.ogrenciyiz.net
Şimdi tekrar imleçleri hareket ettirir ve her seferinde kilit oluşunca imleçlerin gösterdiği isimlerin yerlerini değiştirmeye devam ederiz. Sonunda iki imleç listenin bir yerinde birbirini kesecektir. Örneğimizde bu kesişme Gül ile Tolga arasında olacaktır. Yani; imleçlerin kesişmesi ile liste aşağıdaki hale gelecektir: Jale (pivot) Pivottan büyük yada Bülent ona eşit isimler Ali Ceyda Canan Banu B Gül A Tolga Pivottan büyük isimler Sema Kemal www.ogrenciyiz.net
Artık pivot elemanı doğru yere yerleştirebilecek bir duruma gelmiş olduk. Yukarıdaki açıklamalardan da anlaşılacağı gibi, pivot elemanı B imlecinin gösterdiği yere girmelidir. Bu işlemi yapmanın en kestirme yolu pivot ile B imlecinin gösterdiği elemanları değiştirmektir. Bu değişimden sonra listemiz şu hale gelecektir: www.ogrenciyiz.net
Gül Bülent Ali Ceyda Canan Banu B Jale (pivot) A Tolga Sema Kemal www.ogrenciyiz.net
Bu kadar uğraşıdan sonra sadece listedeki bir elemanın yerini bulabildik! Ne var ki, biraz dikkat edilirse, bundan sonraki işin çok kolay olduğu fark edilebilir. Zira yapılması gereken iş, aynı yöntemi tekrarlayarak iki alt listeye uygulamaktır. Bu yaklaşım yapılması gereken iş miktarını iki katına çıkarmış görünse de listelerin boyları hızla kısaldığı için çabuk bitecektir. www.ogrenciyiz.net
İf(Liste ikiden az eleman içeriyorsa) Şimdi de Hızlı Sıralama Algoritmasını bir sözde-kod ile sunalım. Bu işlemi Sırala adı verilen bir yordam ile çağıralım. Bu yordamın ilk işi listenin uzunluğunu ölçmektir. Eğer, listede iki veya daha fazla isim varsa yordam, if-then-else yapısının esle kısmına dallanarak devam eder. İf(Liste ikiden az eleman içeriyorsa) Then(Listeyi sırala olarak belirle) Else (Listenin ilk elamanını pivot elemanı olarak seç A imlecini listenin ikinci ve B imlecini de son elemanına yerleştir www.ogrenciyiz.net
While (A ve B imleçleri kesişmediği sürece) do [B imlecini yukarı doğru pivottan küçük veya ona eşit olan elemana kadar kaydır; A imlecini aşağı doğru pivottan büyük olan elemana kadar kaydır) İf (A ve B imleçleri kesişmiyorsa) Then(imleçlerin gösterdiği yerlerin elemanlarını değiştir)] B imlecinin gösterdiği eleman ile pivot elemanın yerini değiştir. Sırala yordamını pivotun üstündeki listeye uygula Sırala yordamını pivot elemanının altındaki listeye uygula. www.ogrenciyiz.net