iPhone kullanıcıları, PC World Türkiye iPhone uygulaması yayında... Detaylar için tıklayın.
bul.pcworld.com.tr/
İNCELEMELER
Ürün inceleme kategorileri:
Ücretsiz Haber Postası
Haftalık ve aylık bültenlerimize üye olun, bilişim dünyasındaki tüm yenilikleri ilk siz öğrenin.
PC World Türkiye
30 Mayıs 2009 / 22:34
Sıralama Sorunsalı :P
Programlamacının işi genel olarak elindeki bazı verileri (Bunu bir kısım ulema girdi diye isimlendirmektedir.) öğrenmek ve bunları isteğe uygun olarak işleyip istenen sonucu (Az önce bahsi geçen ulemalar buna çıktı demektedir) vermektir.

İlk Defa Konuya Aniden Girildiğini Fark Eden Okuyucu Tepkisi: Hayırdır muhterem yazarım, birden konuya daldın, selam sabah yok mu?
Ne Yapsa Yaranamayan Yazar Psikolojisine Bürünmüş Tepki: Kardeşim mevzuya yavaşça intikal etmek istesek bu sefer biz ne dergisi okuyoruz diye hayıflanıyorsun ama…
Konuya Devam Etmeyi Sağlayan Cevap: Tamam tamam, pardon. Ne diyordunuz?

Konuya Devam: Diyelim ki şirketimiz ay (veya yıl) içerisinde bir sürü satış yaptı, kimisine borcunu verdi kimisini veremedi… Borçlarını da işlem sırasına göre kayıt etti. Biz de şimdi yüksek miktardaki borçlarımızı merak ediyoruz ve bir liste yapmak istiyoruz. Bunun için de belirli bir borç limiti değil de ödeyeceğimiz toplam paraya göre bir limit koyduk kendimize. Ne yapsak daha verimli bir takip yapmış oluruz?
Ani Cevap: Borçları büyükten küçüğe sıralarız!
Ani Cevaba Ani Soru: Neden?
Ani Soruya Doğru Cevap: Listeyi yukarıdan tarayıp yüksek gördüğüm borçları seçsem alttaki daha yüksek borçlara gelmeden vermeyi düşündüğüm toplam parayı bitirebilirim. O yüzden tüm borçları sıralayayım ki kesin olarak en yükseklere ödeme yapabileyim!
Ani Cevaba Konu Dışı Bir Gereksiz Bir Yorum: Tabi ki en güzeli tüm borçları ödemek değil mi… Her ne kadar borç yiğidin kamçısı olsa da…
Konuya Dönme İsteği: E sıraladık diyelim?
Açıklamalara Devam: Burada görüyoruz ki sıralama yapmadan önce tüm girdiler bizde kayıtlı. Yani önceden tüm girdiler girilmiş.
Açıklamaya İlişkin Bir Soru: Peki tüm girdilerin önceden girilmediği durum nasıl oluşur ki? Yani sayıları bilmeden nasıl sıralayacağız?
İlişkin Soruya Cevap: İyi de… Sayıları bilmiyor olmayacağız ki! Fakat bu soruyu erken sordun. Bu soruyu ileride hatırlat!
Meraklı Okuyucunun Merakını Bastırma Olayı: Hay Allah! Nasıl dayanacağım ben şimdi o ana kadar. Neyse canım, sağlık olsun.
Konuya Devam: O halde düşün bakalım, acaba 50 tane sayıyı (fiyatı) büyükten küçüğe sıralayacak biçimde nasıl sıralarsın?
Konuya Devama Giriş: İlk önce sayıları öğrenirim tabi ki. Sonra da sıralayacağız. Sıralamada birinci sıra, ikinci sıra, … gibi belirliliği sağlamak için geçen sayıda gördüğümüz DİZİ değişkenden faydalanacağız. Mesela “Sayı” isminde bir dizi değişkenimiz olsun. Sayı[1] dediğimizde birinci sıradaki sayıyı yani en büyüğü, Sayı[2] dediğimizde ikinci sıradaki sayıyı yani ikinci en büyüğü belirlemiş olacağız.
Kutlama: Tebrik ederim. Sıralamayı bitirdin!
Kutlamayı Şaşkınlıkla Karşılama: Nasıl olur? Daha sayıyı nereye koyacağımızı söyledim. Yoksa sıralamanın nasıl olacağına geçmedim ki?
Meselenin Özünü Yazdığının Farkında Olmayan Öğrenciye Ne Yazdığının Farkına Vardırılması: Yahu sen ne dedin? Birinci sırada en büyük sayı, ikinci sırada ikinci en büyük sayı gelecek demedin mi?
Ani ve Net Cevap: Evet!
Konuya Devam: E sen en büyük bulmasını bilmiyor musun?
İkinci Ani ve Net Cevap: Evet!
Konuya Tekrar Devam: O halde? Demek ki Sayı dizinindeki sayıların içinden en büyüğü bulacaksın! Sonra…
Kesme ve Konuyu Anladığını Belirtircesine Çılgınca Cevabı Devam Ettirme: Sonra kalanların içinden en büyüğünü bulacağım! Sonra kalanların en büyüğü ve böyle böyle Sayı dizisinin son elemanına kadar gideceğim!
Heyecanı Bölme ve Bir Mesele: Doğru! Peki acaba bu sıraladıklarını nereye koyacaksın?
Meselenin Basit Bir Çözümü: Hmm… Mesela “Sıralanan” diye yine 50 elemanlık bir dizi daha tanımlasak ve oraya yerleştirsek?
Destek Verme: Yanlış değil! O halde yap bakalım!
Sıralama Denemesi: Sayıları Sayı[] dizisine aktarmış olalım. Başlangıçta en büyük atayalım.O da dizinin ilk elemanı olsun. Ve sırayı tutan i’nin başlangıç değeri 1 olsun.

Adım 1: EnBüyük=Sayı[1] olarak ata.
Adım 2: i’yi 1 artır. (Başlangıcı 1 idi)
Adım 3: Sayı[i]>=EnBüyük ise EnBüyük=Sayı[i]
Adım 4: Eğer i=50 ise devam et değilse Adım 2’ye git.
Adım 5: Sıralanan[i]=EnBüyük

Eski Günleri Hatırlatan Bir Soru : Oldu mu?
Eski Günleri Hatırlatan Bir Cevap : Olmadı mı? Galiba olmadı.
Eski Günleri Hatırlatan Soruya Verilen Cevaba Cevap: Tabi ki olmadı. Neden?
E.G.H.S.V.C.C.C. : Bana da bir gariplik varmış gibi gelmişti zaten.
E.G.H.S.V.C.C.C.C : Olmadı çünkü sen ilk en büyüğü buldun ve onu da gittin Sıralanmışın en sonuna koydun! Ne eksiğin var? Mesela algoritmada diğer büyükleri bulmaya geçmeyi sağlamalısın. Ve geçerken de sayının sırasını doğru olarak belirlemelisin ki “Sıralanan” dizisinde doğru yere koyasın!
… C.C.C. : Önerin var mı? Nasıl yapayım?
… C.C.C. : Direk öneri vermeyeceğim. İpucu vereceğim. Bir kere eğer sıralanmış diziyi yerleştirirken  Sıralanan[i] ifadesini kullanırsan o zaman hep 50. elemana yerleştirme yaparsın. Çünkü Adım 5’e sadece i=50 olduğunda geçiyor. Yani oradaki “i” indisi KAÇNICI EN BÜYÜK sorusuna yanıt vermiyor! Ayrıca, sadece 1 defa EnBüyük buldun! Halbuki 50 defa en büyük bulmalısın!
Üzülme ve Umutsuzluk Hissi: Ağlayacağım ya… Ben nasıl bileyim şimdi bunların hepsine nasıl çözüm bulacağımı :(  Neyse, deneyelim.
Moral Motivasyon Sözleri : Hadi… Bırakma kendini, olacak bu iş! Ağlama!
Hemen de Gaza Geliş ve Algoritma Denemesi: Tabi! Sağol varol abi! Deneyeceğim!
 
Adım 1: EnBüyük=Sayı[1] olarak ata.
Adım 2: EnBüyükSırası=1 olarak ata.
Adım 3: i’yi 1 artır. (Başlangıcı 1 idi)
Adım 4: Sayı[i]>=EnBüyük ise EnBüyük=Sayı[i]
Adım 5: Eğer i=50 ise devam et değilse Adım 2’ye git.
Adım 6: Sıralanan[EnBüyükSırası]=EnBüyük
Adım 7: EnBüyükSırası’nı 1 artır.
Adım 8: i=1 olarak ata.
Adım 9: EnBüyükSırası=50 ise dur. Değilse Adım 3’e git.

Oldu mu?
Olumsuz Cevap: Olmadı ama olur gibi oldu! Şimdi burada ne yaptın? En büyüğü bulduğun sıra ile kaçıncı en büyük olduğunu bulan sırayı farklı indislerle gösterdin. Bu güzel. Sonra “iç içe döngü” kurulması gerektiğini gördün. Neden? Çünkü döngülerden birisi kalan sayılar arasında “en büyüğü” bulan döngü, ikincisi ise o en büyüğün kaçıncı sıradaki en büyük olduğunu bulan döngü. Fakat burada bir sorum var algoritman için. Acaba algoritman ikinci en büyüğü bulurken Adım 4’te Sayı[i] ile yine baştan başlıyor. Üstelik ikinci döngüye geçtiğinde “EnBüyük” değişkenini değeri de evvel ki döngüde bulduğun en büyük sayı. Haliyle yine aynı en büyük sayı çıkmaz mı sonuç olarak?
Olumsuz Cevaba Katkılar : Doğru, böylece “Sıralanan” dizisinin tüm elemanları bu en büyük değeri gösterecek değil mi! Dolayısıyla hem her döngüye girişte bu en büyük sayıyı değiştirmeliyim hem de her döngüye gelişte bir evvelki en büyük sayıyı karşılaştırılamaz duruma getirmeliyim, değil mi!
Tebrik, Kutlama ve Bakla: Evet!Bravo! Helal olsun! İşte bu! İstersen şunu bir incele: EnBüyükSıra ve i değişkenlerinin başlangıç değerleri 1 olsun.

Adım 1: EnBüyük=Sayı[1] olarak ata.
Adım 2: i’yi 1 artır.
Adım 3: Sayı[i]>=EnBüyük ise EnBüyük=Sayı[i] ve Degisecek=i
Adım 4: Eğer i=50 ise devam et değilse Adım 2’ye git.
Adım 5: Sıralanan[EnBüyükSıra]=EnBüyük
Adım 6: Sayı[Degisecek]= -1
Adım 7: EnBüyükSıra’yı 1 artır.
Adım 8: i=1 olarak a ta.
Adım 9: Eğer EnBüyükSıra=50 ise devam et, değilse Adım 1’e git.

Burada iç döngü içindeki EnBüyük değişkeninin değerine karşılık gelen Sayı[i] ‘nin indisini kaybetmemek için Degisecek diye bir değişkene atıyoruz ve Sayı[Degisecek] ‘in değerini en büyüğü bulan döngü bittikten sonra, bir sonraki döngüde bu sayının tekrar kullanılmaması için (yani yine EnBüyük olarak seçilmemesi için) -1 olarak atıyorum. İşte bitti.

Fakat sıralama için onlarca yöntem bulunabilir. Bunu söylemiş miydim? Mesela illaki başka bir dizi değişken kullanmak zorunda değiliz.

Hatırlamayan Tepki: Yooo… İlk defa duyuyorum.
İkinci Hatırlatma : Peki sıralama tüm sayıları bilmeden de yapılabilir demiştim, onu hatırlıyor musun?
Hatırlayan Tepki: Evet evet, onu hatırlıyorum!



Yapılan yorumlar: (1)

  PCW Online Ziyaretçisi tarafından 31 Mayıs 2009 tarihinde yazıldı:
bir yazı dizisi bana bile algoritma mevzusunu anlatabiliyorsa o yazı dizisi kusursuzdur.bu durumun matematiksel ispatı algoritma konusunda benim baz vektör olmamdır.teşekkürler üstad. (yusuf karadeniz)

PCW Online Ziyaretçisi ismiyle bu yazı hakkında benim de söyleyeceklerim var:

Yorumlarınızın kendi isminiz ve resminizle hemen yayınlanmasını istiyorsanız, siteye üye olabilirsiniz.



PC World Galeriden



Bloglar: Haftanın En Çokları