Yaklaşık 15 aydır sürdürdüğümüz Algoritma köşemizin geçtiğimiz sayısında “sıralama” konusuna gelebilmiş ve temel bir giriş yapmıştık. Fakat bu yazı dizi biçimi bazı okuyucularımızın kendilerini uzaylı gibi hissetmesine neden olabiliyor. Bu noktada, köşemizi daha bilerek ve daha verimli takip edebilmek için geçmiş sayılarımızı, dergimizin internet sitesinin “Online Makaleler” bölümünden takip edebileceğinizi hatırlatmak isterim.
Sabırsız Okuyucu Tepkisi: Ya muhterem yazarım, boş ver şimdi, hadi sıralayalım artık şu sayıları!
Şaşıran Yazar Tepkisi: Geçen ay sıraladık ya! Unuttun mu?
Baskın Çıkan Okuyucu Tepkisi: Evet sıraladık ama oldukça amatör olmuştu! Mesela gereksiz yere dizi değişken kullanmıştık ve siz bu sorunu ortadan kaldıracağınızı vaat etmiştiniz!
Sözünde Duran Yazar Cevabı: Doğru yahu! Haklısın. İstersen bir anlat bakalım nasıl sıralama yapmıştık.
Dersine Çalışmış Öğrenci Tepkisi: Şimdi elimizde önceden bilinen adette (örneğin 50 tane) sayı olsun. Algoritmamızda ilk önce bir diziye yerleştirdiğimiz bu belli adette sayının en büyüğünü bulduk ve bunu kaybetmemek için başka bir dizinin ilk sırasına kaydettik.
Dinlediğini Belli Eden Bir Ses: Hı hı…
Tekrara Devam: Sonra geriye kalan sayıların (ki bunlar artık 49 tanedir) en büyüğünü bulduk ve sıralanan dizinin ikinci sırasına koyduk. İşlem böyle böyle devam etti.
Tekrar Sonrası Değerlendirme Mesajı: O zaman hakikatten sıralamışız!
Yazarın Anlamazlıktan Geldiğinin Anlaşılmadığını Düşünen Cevap: Ya iyi de iki tane dizi kullanıyoruz. Tek dizi de nasıl yapacağız ki bunu?
Panik Soruyu Rahatlatan Cevap: Düşündüğün şeye bak! Hallederiz, sıkma canını. Biz bu işlemi, senin az önce anlattığın mantığa dayanan ve “Seçerek Sıralama” (Selection Sort) olarak bilinen algoritma ile yapacağız.
Heyencanlanan Okuyucu Tepkisi: Vay be! Demek literatüre de el atıyoruz!
Konuya Devam Etme: Şimdi düşün, elimizdeki bir SAYI dizisinin elemanları sırasıyla 20, 39, 25, 19, 50 olsun ve sıralamayı küçükten büyüğe yapalım.
Dinleme Mesajı Veren Ünlem: Eee…
Tekrar Konuya Devam Etme: Dizinin birinci elemanı ile ikinci elemanını karşılaştıralım. Madem sıralayacağız, hangisi küçükse o öne geçsin! Dizi[1] < Dizi [2] mi? Yani 20 < 39 mu?
Ani Cevap: Evet! O halde bir yer değiştirme söz konusu değil, çünkü küçük olan zaten bu karşılaştırmada ön sırada!
Tebrik ve İşleme Devam: Dizi[1] < Dizi[3] mü? Yani 20 < 25 mi?
Ani Cevap: Evet ve yine yer değiştirme yok.
İşleme Devam: Dizi[1] < Dizi[4] mü? Yani 20 < 19 mu?
Panik İçinde Ani Cevap: Hayır! O halde yer değiştirmeli çünkü küçük olan öne geçsin istiyoruz.
Tebrik ve Akabinde Yeni Soru: Peki bu yer değişikliğini nasıl yapalım ki elimizdeki veriler değişmesin?
Geçmiş Sayıların Katkısı: Hmm… Geçici bir değişken kullanarak! Bu yöntemi hatırladığım kadarıyla 2006 Aralık sayısında görmüştük! Yer değiştirmeden sonra Dizi[1] değişkeninin değeri 19, Dizi[4] değişkeninin değeri ise 20 olacak.
İkinci Tebrik Ve Uygulamaya Devam: Bu son karşılaştırmadan sonra sıralama 19, 39, 25, 20, 50 olarak belirlendi.
Sabırsız Öğrenci Sorusu: İyi de, madem küçükten büyüğe olacak 20 sayısının 19’dan sonra gelmesi gerekmez miydi?
Sabırsız Tepkiyi Yatıştırma ve İşleme Devam: Bitti dedik mi? Daha dur, yeni başlıyoruz! Nerede kalmıştık…
Hatırlatıcı Cevap: En son Dizi[1] ile Dizi[4]ü karşılaştırmıştık.
Laf Dokundurma ve Sıralamaya Devam: Sağol be! Ama biliyorsun ki bu bir yazı ve haliyle bir kaç satır yukarıyı okuyarak nerede kaldığımı bulabilirdim! Neyse. Karşılaştırma işlemi ilk etapta Dizi[1] değişkeni ile başladığından öylece devam ediyor. Dolayısıyla artık yeni karşılaştırma Dizi[1]’in 19 sayısı ile ilgili olacak! Dizi[1] < Dizi[5] mi? Yani 19 < 50 mi?
Sıradan Bir Beklenen Cevap: Evet! Yani yer değişikliği yok.
İşleme Devam Etmeden Önce Esrarengiz Bir Soru: Böylece biz ne yapmış olduk?
Esrarengiz Soruya Beklenmedik Biçimde Verilen Doğru Cevap: En küçüğü bulduk, bulmakla kalmadık onu en başa getirerek seçmiş olduk!
Şaşıran Yazar Tepkisi: Vay be! Bravo. Peki bu ilk sıraya yerleştirdiğimiz sayı kesinlikle en küçüktür diyebilir miyiz?
Üst Üste Doğru ve Uzun Cevaplar: Evet. Mesela dizinin ilk elemanının en küçük olması durumunda, kendisinden sonraki tüm elemanlarla karşılaştırılacak ve hiç bir sayı ile yer değiştirmeyecekti.
Destek İfadeleri: Evet, haklısın. Sonra?
Açıklamaya Devam: Dizinin ilk elemanının en küçük olmadığı durumda ise ileride bir yerlerde kendisinden küçük olan bir elemanla yer değiştirmesi gerekir. Diyelim ki ilk sayı kendisinden daha küçük bir x sayısı buldu ve yer değiştirdi. Bu aşamadan sonra karşılaştırmaya devam eden sayı bu yeni küçük sayı x olacak! Bu arada rahatlıkla diyebiliriz ki bu yeni en küçük sayı x, kendisine kadar olan tüm sayılardan küçüktür. Zira öyle olmasaydı, işlemin başındaki dizinin ilk elemanı x’e kadar olan sayılardan başka biriyle yer değiştirirdi.
Rehberlik Eden Yazar Refleksi: Bu kısma kadar vardığımız şu; x’e gelene kadar daha küçük bir sayı yok, peki ya sonra?
Vurucu Açıklamalar: Sonrası karşılaştırmada belli oluyor hocam! Malum, eğer x’e kadar en küçük sayı x ise bundan sonraki karşılaştırmalar bu x sayısı üzerinden olmalı!
Vurucu Açıklamalarla Bütünleşme: Evet üzerinde olmalı, yani…
Kesme ve Açıklamayı Bitirme: Yani karşılaştırmaya kaldığımız yerden ve en küçük olarak atadığımız x’in değişkeni Dizi[1] ile devam etmeliyiz.
Ağzı açık Dinleyen Yazar Sözleri ve Sonraki Adımlara Yön Verme: Üff… Seninle gurur duyuyorum. Helal olsun sana. Ya ya ya şa şa şa okuyucu çok yaşa! Peki en küçüğü bulduk. Sonra ne yapacağım?
Gaza Gelen Öğrenci Tepkisi: Artık en küçük sayıyı bulduğuma göre ve onun yerini de ilk sıra olarak belirlediğime göre geçen ay yaptığımız gibi “kalanların en küçüğü” bahsini düşünebiliriz. Yani yeni karşılaştırma Dizi[2] den başlamalı.
Sözü Ele Alma: Evet, doğru. Bundan sonra geçtiğimiz ay yaptığımız “kalanların eni” anlayışı ile hareket ediyor. Ufak bir yer değiştirme işlemi sayesinde ise yeni dizi değişkenine gerek kalmıyor!
Merak: İyi güzel hoş da, algoritmasında problem yok da… Acaba kodlamayı nasıl yapacağız?
Merakı Giderme: Az önce de söylediğimiz gibi…
Ani Bir Kesiş: Söylemedin ki abi, yazdın… Biz de okumaya çalıştık.
Ani Kesişe Cevap ve Devam: Iyy, iğrenç. Evet az önce de yazdığımız gibi ilk önce ilk elemanı tüm elemanlarla karşılaştırıyoruz. Sonra dizinin ilk elemanına “en küçüğü” seçtikten sonra artık ikinci elemandan karşılaştırmaya başlıyoruz çünkü artık ilk sayı bizi ilgilendirmiyor. İkinci adımda en küçüğü seçtikten sonra, 3. adıma geçerken…
Tekrar Ani Kesiş: Diyeceksiniz ki, ikinci kıyaslamadan sonra da ikinci elemana dokunmayacağım!
Tebrik: Bravo.
Meraklı Bakışlar: E o zaman acaba kodlamaya geçsek mi? Bir deneyeyim:
For i=1 to n do
Eğer Dizi[i] < Dizi[…
Aceleci Davrandın İşte Der Gibi Bir Serzeniş: Tıkandın değil mi… Aslında tıkanmayacak gibiydin. İlk karşılaştırma için Dizi[i] ile karşılaştıracağını bilemedin. Sanki onun da indisini tutan bir şey gerekli! Çünkü dizinin her elemanını için kendisinden sonrakilerle karşılaştıracaksın.
Olayın Farkına Varma Belirtileri: Hmmm… Her bir eleman için tüm elemanlar… Buldum! For döngüsündeki her bir eleman için yeni bir döngü açmalıyım! Tekrar deneyeyim:
For i=1 to n do
For i=2 to n do
Eğer Dizi[i]<Dizi[j] ise Geçici=Dizi[i], Dizi[i]=Dizi[j], Dizi[j]=Geçici
Denetleme ve Karar: Kusura bakma ama olmadı. Bu döngüyü çalıştıracak olsak, ilk eleman için “kendisinden sonrakilerle kıyas” yapabilirsin. Ama mesela 3. elemanın tüm elemanlarla kıyaslanması 4. eleman ile başlanmalı. Ama sen burada direk 2’den başlattın!
Ne Yapacağını Bilememe: Tamam, anladım… Anladım da, 2’den başlamayacak ve hatta her seferinde değişecek, hatta her seferinde ilk döngünün 1 fazlasından başlayacak (3. eleman 4. elemanla başlayacak, 4. eleman 5. elemanla başlayacak…) Ama oraya sayı yazmicaz mı?
Son Noktayı Koyma: Cevabı kendin verdin, sayı yazmak zorunda değiliz ve her seferinde ilk döngünün numarasının 1 fazlasından yani i+1’den başlamalı! Böyle olunca ilk dizideki son sayıyı da toplam sayıdan 1 eksik yapmalısın ki son kıyaslamada son terim ile olmayan bir sayıyı kıyaslamaya kalkmasın!
Esas Son Noktayı Koyma: Tamam, seçerek sıralamayı kavradık. Şimdi gelelim sayılar önceden belli değilse ne yapacağımıza.