Sosyal Eklentiler

Kimler Sitede

Åžu anda 4 ziyaretçi Ã§evrimiçi

Bağış

Bu siteyi beğendiyseniz bağış yapabilirsiniz.


Sıralama Algoritmaları
Makale - Visual Basic
Yazar ugokhan   
Çarşamba, 09 Mayıs 2007 18:55

Bilgisayar programlamada en çok kullanılan algoritmalardan biri de sıralama algoritmalarıdır. Burada, en sık kullanılan bazı sıralama algoritmaları anlatılmıştır.

1.YER DEĞİŞTİRME SIRALAMASI (EXCHANGE SORT)

Bir dizideki her bir indisi kendisinden sonraki indislerle sınar. Küçüklük veya büyüklük kuralına uygun karşılaştırma varsa indislerdeki veriler yer değiştirilir. Bu sıralamada aslında tüm indisler asimetrik olarak karşılaştırılmaktadır. Mesela; 3 elemanlı bir dizi için (1 ile 2) , (1 ile 3) ve (2 ile 3) karşılaştırılır ve yeterlidir. 5 elemanlı bir sıralama örneği aşağıda görülmektedir.

resim-1

Yukarıdaki örnekte 5 elemanlı bir dizi sıralanmak istensin. Her elemanı en az şekilde ve tamamen birbiriyle eşleştirmek için yarım matris dizaynında olduğu gibi hareket edilir. Yani, 1.elemanı (2,3,4,5 ile) , 2.elemanı (3,4,5) ile , 3.elamanı (4,5) ile ve 4.elamanı (5) ile karşılaştırırız. Eğer karşılaştırma işleminde şart sağlanıyorsa karşılaştırılan iki veri yer değiştirilir.

'Yukarıdaki Örneğin Kodları
FOR i = 1 to 4
FOR j = i + 1 to 5
IF Dizi(i) < Dizi(j) THEN
' Değiştirme İşlemi Yapılır
END IF
NEXT
NEXT

N Elemanlı Liste İçin Genel Yazımı
FOR i = 1 to N - 1
FOR j = i + 1 to N
IF Dizi(i) < Dizi(j) THEN
'Değiştirme İşlemi Yapılır
END IF
NEXT
NEXT

Burada Dizi(i) < Dizi(j) ifadesi; "ilk seçilen eleman, ikinci seçilen elemandan küçükse yer değiştir" demektir. Böylece en sonunda Büyükten-Küçüğe sıralanmış bir dizi elde edilir. İlk seçilen eleman her zaman ikinci eçilen elemandan önde olduğu için yer değişiminde büyük sayılar öne oğru hareket edecektir. Eğer Küçükten-Büyüğe bir sıralanma istenirse Dizi(i) > Dizi(j) şeklinde değişiklik yapılır.

2. KABARCIK SIRALAMASI (BUUBLE SORT)

Yer değiştirme sıralamasında olduğu gibi anlaşılması kolay bir algoritmadır. Kabarcık Sıralaması yönteminin yer değiştirme yöntemine göre farkı, her geçişte listenin komşu olan elemanlarını kontrol etmesidir.

sema-2

Yukarıdaki şekilde de görüldüğü gibi 6 elemanlı bir dizi küçükten-büyüğe sıralanmak istenmektedir. Kabarcık Algoritması her seferinde komşu iki elemanı kontrol eder. 1 ile 2 , 2 ile 3 , 3 ile 4 ..vs. Eğer alttaki sayı, üstteki sayıdan küçükse yer değiştirma işlemi yapılır. Dizi bu şekilde bir kere tarandığında, dizideki en büyük değer en alta gelir (mor kare). Daha sonra tekrar aynı tarama yapılır. Ama bu sefer en sona kadar değil 5. elemana kadar gidilir. Bu şekilde tüm liste sürekli taranır. Eğer son taramada bir değişiklik olmamışsa tarama işlemi bitirilir. Sonuçta küçükten büyüğe sıralanmış bir dizi elde edilir.

'Taramanın nerede biteceğini tutan değişken
SonIndex = 5
DO
'Değişiklik Sayısı Sıfırlanıyor
DegisiklikSayisi = 0

FOR i = 1 TO SonIndex
IF Dizi ( i ) > Dizi ( i + 1 ) THEN
DegisiklikSayisi = DegisiklikSayisi + 1
END IF
NEXT

SonIndex = SonIndex - 1

LOOP WHILE DegisiklikSayisi = 0

N Elemanlı Liste İçin Aşağıdaki Değişikliği Yapın
SonIndex = N - 1

 

3. SEÇMELİ SIRALAMA (SELECTION SORT)

Bu algoritmada dizinin başından veya sonundan başlanabilir. Davranış şekli (Küçükten-Büyüğe) şöyledir: 1. eleman seçilir. Dizi içindeki en küçük terim bulunarak 1. eleman ile yer değiştirilir. Artık 1. indiste en küçük vardır. 2. eleman seçilir. Diğer sayılar içinden en küçük terim bulunur ve 2. ile yer değiştirilir. Bu şekilde dizinin sonuna kadar tek tarama ile yer değiştirme işlemi yapılır.

sema-2

Yukarıdaki şekilde 8 elemanlı sırasız bir dizi verilmiştir. Amacımız Küçükten-Büyüğe sıralamak olsun. 1.adımda; 1.eleman, dizideki en küçük eleman ile yer değiştirilir. 2.adıma geçeriz. Artık 1.eleman en küçük olarak bellidir. Değiştirilmez (Mor kareler yerleri sabit olan sayılardır). 2.elemanı dizi içindeki en küçük elemanla yer değiştiririz. Bu şekilde bu kuralı baştan sona uygularsanız. Dizi sıralanmış olur. 4.adımda 4.sayıya kadar yerleştirmenin gerçekleştiğine dikkat edin.

'Taramanın nerede biteceğini tutan değişken
SonIndex = 5
FOR i = 1 TO 7
' En Küçük Eleman i.Eleman Olarak Varsayılır.
min = i
' Gerçek En Küçük Eleman Aranır
FOR j = i + 1 TO 8
IF dizi(j) < dizi(min) THEN min = j
NEXT

' En Küçük Bulundu. Değişiklik Yapılır.
SWAP dizi(i), dizi(min)
NEXT

' N Elemanlı Liste İçin
FOR i = 1 TO N-1
min = i
FOR j = i + 1 TO N
IF dizi(j) < dizi(min) THEN min = j
NEXT j
SWAP dizi(i), dizi(min)
NEXT

 

4.BİRLEŞMELİ SIRALAMA (MERGE SORT)

Bu algoritma iki sıralı diziyi tek bir dizide sıralamak için kullanılır. N elemanlı, sıralı bir A dizisi ile M elemanlı, sıralı bir B dizisini; (M + N) elemanlı bir C dizisine sıralı olarak yerleştirir. Bu işi teorik olarak önce A'yı sonra da B'yi, C dizisi içine yazdırarak ve C dizisini sıralatarak da bulabiliriz. Ama bu algoritma etkin olmaz. Zaten sıralanmış olan dizileri bozmuş oluruz. Bunun daha kolay yapılabilmesi için aşağıdaki işlemler yapılır.

sema-4

Yukarıdaki şekilde 5 elemanlı bir A dizisi ile 6 elemanlı bir B dizisi, 11 elamanlı C dizisi içerisine sıralı olarak yerleştirilmek isteniyor. Dizilerin yanlarındaki "kırmızı oklar" o an seçilmiş olan indisleri göstermektedir. C deki "mavi ok" ise C üzerine bilgi girilecek indis numarasını tutmaktadır.
A dizisi ile B dizisinin 1.elemanları karşılaştırılır. Hangisi küçükse C'ye o yazılır. Örnekte yeşil ile gösterilen eleman küçük olduğu için A dizisinin 1. elemanı C'ye 1.eleman olarak yazılır. A dizisinin ve C dizisinin indis sayaçları 1 arttırılır. Tekrar sınama yapılır. Bu sefer B'nin 1.elemanı A'nın 2.elemanında küçüktür. C'ye B'nin 1. elemanı yazılır. B ve C'nin indis sayaçları 1 arttırılır. Kural : Kimin verisi C'ye yazılıyorsa o dizinin indis sayacı 1 arttırılır. C'nin ki de 1 arttırılır.
Burada karşılaşılabilecek bir durum, A veya B'nin erkenden bitmesidir. Bu durumda A dizisinin indis sayacı > 5 veya B dizisinin indis sayacı > 6 olduğunda diğer dizi aynen yazılarak devam edilir. Yani, örnek devam ederse görülecektir ki, A dizisinin son elemanı olan 52, C'ye yazıldığında B dizisinin indis sayacı 4 (47'nin üzerinde)'dir. Artık A dizisi bitmiş olduğundan herhangi bir sınama yapmadan B dizisi aynen yazılmaya devam edilir.
' Dizilerin indisleri 1'e eÅŸitlenir.
indisA = 1: indisB = 1: indisC = 1

' Dizilerden biri sonlanana kadar DO-LOOP döngüsü çalışır.
DO
IF A(indisA) < B(indisB) THEN
C(indisC) = A(indisA)
indisA = indisA + 1
ELSE
C(indisC) = B(indisB)
indisB = indisB + 1
END IF
indisC = indisC + 1
LOOP WHILE NOT (indisA > 5 OR indisB > 6)

' Dizilerden biri önce biteceği için diğer dizi aynen yazılır.
IF indisA > 5 THEN
FOR j = indisB TO 6
C(indisC) = B(j)
indisC = indisC + 1
NEXT
ELSE
FOR j = indisA TO 5
C(indisC) = A(j)
indisC = indisC + 1
NEXT
END IF
' N Elemanlı Liste İçin Genel Yazım
indisA = 1: indisB = 1: indisC = 1

DO
IF A(indisA) < B(indisB) THEN
C(indisC) = A(indisA)
indisA = indisA + 1
ELSE
C(indisC) = B(indisB)
indisB = indisB + 1
END IF
indisC = indisC + 1
LOOP WHILE NOT (indisA > N OR indisB > M)

IF indisA > N THEN
FOR j = indisB TO M
C(indisC) = B(j)
indisC = indisC + 1
NEXT
ELSE
FOR j = indisA TO N
C(indisC) = A(j)
indisC = indisC + 1
NEXT
END IF



 

Yorumlar  

 
+1 #4 yasin 2011-12-12 11:22
Library sort ile ilgili bilginiz var mı??
Alıntı
 
 
0 #3 2011-01-03 18:01
kolaylıkla anlasılabılecek bı anlatım olmuş elinize sağlık
Alıntı
 
 
0 #2 2011-01-03 17:34
teşekkürler gökhan
Alıntı
 
 
+1 #1 2010-06-09 13:50
Çok güzel bi anlatım olmuş elinize sağlık..
Alıntı
 

Yorum ekle

TCK'ya aykırı, yasadışı ve genel ahlaka aykırı yazılar ile konu dışında yazılar, istekler, spam ve reklam amaçlı mesajlar yazılması YASAKTIR. Bu tür yazılar görüldüğü anda tarafımdan silinecektir. Herhangi bir uygunsuzluğun olduğunu düşündüğünüz yazılar için lütfen bana eposta yoluyla haber veriniz.


Güvenlik kodu
Yenile