2. SIRALAMA ALGORİTMALARI
Bilgisayar saklama ünitelerinde tutulan verilerin performansı yüksek bir şekilde işlenebilmesi
için en kısa zamanda ulaşılabilir özellikte olması gerekir. Verilere hızlı erişmek için kullanılan
yöntemlerinden biri de sıralamadır. Veriler, sıralanmak suretiyle ilgili veriye erişilme zamanı
hızlandırılabilir. Sıralama, sayısal ortamdaki sayı veya katar verilerinin, bir anahtar kriterine
göre yapılan düzenlemedir. Anahtar, bir sayı değeri olabileceği gibi bir kelime veya bir katar
olabilir.
Verileri sıralamak maksadıyla geliştirilmiş birçok sıralama algoritması vardır. Geliştirilecek
uygulamaya bağlı olarak seçilen veri yapısı, veri kümesindeki toplam veri sayısı gibi özellikler
kullanılacak sıralama algoritmasını belirler. Sıralama yapılırken en çok kullanılan algoritmalar
seçim, araya yerleştirme, kabarcık algoritmalarıdır.
1.1. Seçim Algoritması
Seçim (selection) sıralama algoritmasında belirlenen kritere göre en uygun 1. veri, en uygun
2. Veri, … değerleri bulunarak veriler küme içinde yer değiştirilerek sıralama gerçekleştirilir.
Örneğin sayilar dizisinde tutulan 5 tane sayının büyükten küçüğe seçim algoritması
kullanarak sıralanması istenirse; önce sayilar dizisinin en büyük elemanı bulunur ve dizinin 1.
elemanı yapılır, daha sonra sayilar dizisinin 2. en büyük elemanı bulunur ve dizinin 2.
elemanı yapılır ve bu süreç dizinin son elemanı bulunana kadar devam eder. İşlem bittiğinde
veri kümesindeki elemanlar sıralanmış olur. Aşağıdaki şekilde bellekte tutulan değer
hareketleri gösterilmiştir. Algoritma her bir adımda konuma ait değerin bulunması için bir
döngü, diğer adımlara geçebilmek için bir döngü olmak üzere iç içe iki döngü kullanılmalıdır.
Şart sağlandığında dizide yer alan elmanı kaybetmemek için bir tane tampon değişken
kullanılmalıdır.
Örnek: sayilar={10, 22, 9, 35, 14}
Adım 1
sayilar
[0] 10
[1] 22
[2] 9
[3] 35
[4] 14
Dizinin 0.
Konumunda
bulunan değer
sırayla kendinden
sonraki elemanlar
ile karşılaştırılır ve
küçük olduğu
eleman ile yer
değiştirir. Böylece
dizinin en büyük
elemanı 0. konuma
Adım 2
sayilar
[0] 35
[1] 10
[2] 9
[3] 22
[4] 14
Dizinin 1.
konumunda
bulunan değer
sırayla kendinden
sonraki elemanlar
ile karşılaştırılır ve
küçük olduğu
eleman ile yer
değiştirir. Böylece
dizinin en büyük 2.
elemanı 1. konuma
Adım 3
Sayilar
[0] 35
[1] 22
[2] 9
[3] 10
[4] 14
Dizinin 2.
konumunda
bulunan değer
sırayla kendinden
sonraki elemanlar
ile karşılaştırılır ve
küçük olduğu
eleman ile yer
değiştirir. Böylece
dizinin en büyük 3.
elemanı 2. konuma
Adım 4
sayilar
[0] 35
[1] 22
[2] 14
[3] 9
[4] 10
Dizinin 3.
konumunda
bulunan değer
sırayla kendinden
sonraki elemanlar
ile karşılaştırılır ve
küçük olduğu
eleman ile yer
değiştirir. Böylece
dizinin en büyük 4.
elemanı 3. konuma
İşlem sonu
sayilar
[0] 35
[1] 22
[2] 14
[3] 10
[4] 9
Dizinin 4. (son)
konumunda
bulunan değer ile
ilgili işlem yapılmaz.
3. yerleştirilir. yerleştirilir. yerleştirilir. yerleştirilir.
Örnek 2:
void selection(int sayi[N])
{
int i,j,buffer;
for(i=0;i<N-1;i++){
for(j=i+1;j<N;j++){
if(sayi[i]<sayi[j])
{
buffer=sayi[i];
sayi[i]=sayi[j];
sayi[j]=buffer;
}
}
}
}
Ödev: 24 kişilik bir sınıfta bulunan öğrencilerin numaraları ve matematik dersinden aldıkları
puanlar bir diziye klavyeden giriliyor. Bu sınıftaki öğrencilerin numaralarını ve puanlarını,
seçim algoritması kullanarak aldıkları puana göre küçükten büyüğe sıralayıp, ekranda
gösteren programı hazırlayınız.
1.2. Araya Yerleştirme Algoritması
Araya yerleştirme (insertion) sıralama algoritmasında belirlenen kritere göre sıralanacak veri
kümesi alt kümeleri ayrılarak sıralama gerçekleştirilir. Bu algoritmada alt kümeler kümenin 1.
Elemanı ile 2. Elemanı, kümenin 1. Elemanı ile 3. Elemanı arasındaki elemanlar, kümenin 1.
Elemanı ile 4. Elemanı arasındaki elemanlar biçiminde ve son elemana kadar olmak üzere
olan birliklerdir. Algoritmanın 1. Adımında ilk küme, 2. Adımında ikinci küme şeklinde devam
4. edilerek son adımda sıralı veri kümesi elde edilir. Aşağıdaki örnekte sayilar kümesinin araya
sokma algoritması kullanılarak büyükten küçüğe sıralama işlemleri ve bellek değerleri
gösterilmiştir.
Örnek: sayilar={10, 22, 9, 35, 14}
İşlem basamakları İşlem Öncesi İşlem sonrası
1. Adım 10 22 9 35 14 22 10 9 35 14
2. Adım 22 10 9 35 14 22 10 9 35 14
3. Adım 22 10 9 35 14 35 22 10 9 14
4. Adım 35 22 10 9 14 35 22 14 10 9
Araya yerleştirme algoritması, sıralı haldeki dizilere, oluşturulmuş sıralama bozulmadan
eleman eklemek için uygun bir algoritmadır. Bu algoritmanın en önemli dezavantajı eklenen
elemanın, uygun konuma yerleştirilirken kendinden sonra gelecek elemanların küme
içerisinde kaydırma gerekliliğidir. Örneğin bu işlem dosyalar üzerinden gerçekleştiriliyorsa,
dosya için birçok defa oku/yaz işlemleri tekrarlanacaktır. Bu durum istenmeyen bir
performans kaybına neden olabilir.
Örnek 2:
void insert(int sayi[N])
{
int i,j,buffer;
for(i=1;i<N;i++)
{
buffer=sayi[i];
j=i;
while(j>0 && sayi[j-1]<buffer)
{
sayi[j]=sayi[j-1];
j--;
}
sayi[j]=buffer;
}
}
Ödev: Bir sayı dizisinde 10 adet sayı küçükten büyüğe sıralanmış olarak tutulmaktadır. Bu
sayı dizisine dışarıdan 4 tane eleman girilecek fakat her eleman sıralama bozulmadan uygun
konuma yerleştirilecektir. Bu işlemi yapan programı hazırlayınız.
5. 1.3. Kabarcık Sıralaması
Kabarcık sıralama (bubble sort) algoritmasında belirlenen kritere göre veri kümesinde
bulunan art arda bulunan elemanlar sondan başa veya baştan sona doğru birbirleriyle
karşılaştırılarak sonuca ulaşılır. Bu algoritma için seçim algoritmasında olduğu gibi iki döngü
kullanılır. İlk döngüde işlenen elemanın küme içerisindeki konumu belirlenir. 2. Döngü ile
küme içerisinde yer alan bütün elemanlara 1. döngüde yapılan işlemlerin tatbik edilmesi
sağlanır. Bu döngüler iç içedir. Aşağıdaki örnekte sayilar kümesinin kabarcık sıralama
algoritması kullanılarak büyükten küçüğe sıralama işlemleri ve bellek değerleri gösterilmiştir.
Kabarcık algoritması ilk elemandan başlatılmıştır; fakat sondan da başlatılabilir.
Örnek: sayilar={10, 22, 9, 35, 14}
Adım 1
sayilar
[0] 10
[1] 22
[2] 9
[3] 35
[4] 14
Dizinin 0.
konumunda
bulunan değer ile
komşusu
karşılaştırılır ve şart
sağlanırsa yer
değiştirilir. Sonra 1.
İle komşusu
karşılaştırılır ve şart
sağlanırsa yer
değiştirilir. Küme
sonuna kadar işlem
sürdürülür. Böylece
dizinin en küçük
elemanı yerleştirilir.
Adım 2
sayilar
[0] 22
[1] 10
[2] 35
[3] 14
[4] 9
Dizinin 1.
konumunda
bulunan değer
sırayla kendinden
sonraki elemanlar
ile karşılaştırılır ve
küçük olduğu
eleman ile yer
değiştirir. Böylece
dizinin en büyük 2.
elemanı 1. konuma
yerleştirilir.
Adım 3
sayilar
[0] 22
[1] 35
[2] 14
[3] 10
[4] 9
Dizinin 2.
konumunda
bulunan değer
sırayla kendinden
sonraki elemanlar
ile karşılaştırılır ve
küçük olduğu
eleman ile yer
değiştirir. Böylece
dizinin en büyük 3.
elemanı 2. konuma
yerleştirilir.
Adım 4
sayilar
[0] 35
[1] 22
[2] 14
[3] 10
[4] 9
Dizinin 3.
konumunda
bulunan değer
sırayla kendinden
sonraki elemanlar
ile karşılaştırılır ve
küçük olduğu
eleman ile yer
değiştirir. Böylece
dizinin en büyük 4.
elemanı 3. konuma
yerleştirilir.
İşlem sonu
sayilar
[0] 35
[1] 22
[2] 14
[3] 10
[4] 9
Örnek 2:
void bubble(int sayi[N])
{
int i,j,buffer;
for(i=0;i<N-1;i++){
for(j=0;j<N-1-i;j++){
if(sayi[j]<sayi[j+1])
{
buffer=sayi[j];
sayi[j]=sayi[j+1];
sayi[j+1]=buffer;
}
}
}
}
6. Ödev: Klavyeden girilen 100 tane sayıyı, kabarcık sıralama algoritmasını sondan başa doğru
uygulayarak, küçükten büyüğe sıralayıp ekranda gösteren programı hazırlayınız.
1.4. Alfabetik Sıralama
Sıralama yapılırken verinin içeriği yani sayı veya katar olması, karşılaştırma işlemini temelde
etkilemez. Yukarıda sayılara uygulanan sıralama algoritmaları, alfabetik sıralama için de
kullanılabilir. Fakat karşılaştırma yapılırken kullanılacak operatörün katar verilerine uygun
olması gerekir. Bu işlem için strcmp() fonksiyonu kullanılır. strcmp(), arşılaştırılan iki veri
aynıysa 0, farklı ise üzerinde bulundurduğu karakterlerin alfabetik sıradaki konumlarına göre
pozitif veya negatif bir değer döndürür.
Ödev: Klavyeden girilen 10 adet isim değerleri bir kümede tutulmaktadır. Bu isimleri alfabetik
artan (A’dan Z’ye doğru) sıralama yaparak ekranda gösteren programı seçim algoritması
kullanarak gerçekleştiriniz.
1.5. Hızlı (Quick, Pivot) Sıralama
Hızlı sıralama algoritması böl ve yönet politikasına dayanır; sıralanması istenen dizi belirli bir
karşılaştırma (pivot) değerine göre iki alt diziye ayrılır. İkiye ayırma işlemi, bu karşılaştırma
değerinden küçük olan elemanlar bir tarafta, büyük olan elemanlar diğer tarafta yerleştirilerek yapılır.
Bu işlem geriye kalan her bölme üzerinde tekrarlanır. Karşılaştırma değeri ya rastgele seçilir ya da
dizideki az sayıda elemanın değerinin ortalaması alınır. Hızlı sıralama algoritması en etkin (en hızlı
çalışan) algoritma olmasına rağmen az sayıda elemana sahip dizilerde veya zaten neredeyse sıralı
olan dizilerde tekrarlanan çağrılardan dolayı tercih edilmeyebilir. Hızlı arama algoritmasında recursive
(özyinelemeli) yapı kullanılır.
Hızlı sıralama algoritmasını kullanarak dizi elemanlarını artan şekilde sıralamak için gerekli işlem
basamakları:
1. İlk olarak sıralanacak diziyi ikiye bölmek için bir pivot (karşılaştırma değeri) seçilir. Pivot
genellikle verilen dizinin ilk elemanı ya da son elemanı olabilir. Dizide pivottan büyük
elemanlar pivotun sağına (üst), pivottan küçük elemanlar ise pivotun soluna (alt) konur. Pivot
ise oluşan bu iki kümenin ortasına (orta) yerleşir. Böylece verilen dizi birbirinden bağımsız
olarak iki alt diziye ayrılmış olur.
2. Hızlı sıralama algoritması bağımsız bu iki alt dizi (üst ve alt) içerisinde de recursive olarak
çağrılır ve bu diziler kendi içerisinde 1.adım tekrarlanarak ikiye ayrılırlar. Bu işlemler diziler
parçalanmayacak duruma gelene kadar tekrarlanır.
Alt Orta Üst
7. A Dizisi
Örneğin;
Sıralanacak dizi;
Başlangıç
Durumu;
1.Adım
2.Adım
3.Adım
4.Adım
5.Adım
1. Sıralanacak dizinin son sayısı (13) pivot elemanı (karşılaştırma) olarak seçilir. Bu eleman daha
sonraki arama ve yer değiştirme işlemlerine tabi olmaz.
2. Sol başta pivot elemanı 13’ten büyük olan ilk sayı bulunur ve sağ baştan 13’den küçük ilk sayı
bulunur. Daha sonra bu iki sayı yer değiştirilir.
3. Soldan pivot elemanından (13) büyük ve sağdan pivot elemanından küçük sayılar ortada
buluşana kadar 2.adım tekrarlanır.
4. 3.adımda soldan 13’ ten büyük ve sağdan 13’ten küçük sayılar ortada buluştuğu için (5 ve 83)
13 ile 83 yer değiştirir. Pivotun solundaki alt dizi ve sağındaki üst dizi kendi içinde aynı
teknikle sıralanır.
void quick(int sayi[], int start, int end, int pivot)
{
int location,bound;
if (start < end)
{
pivot = sayi[end];
location = start;
bound = end;
while (location < bound)
{
if (sayi[location] > pivot)
Pivot
elemanından
küçük
elemanlar
Pivot
elemanı
Pivot
elemanından
büyük
elemanlar
14 5 83 23 4 87 13
14 5 83 23 4 87 13
4 5 83 23 14 87 13
4 5 83 23 14 87 13
4 5 13 23 14 87 83
Alt dizi sıralanır. 13 Üst dizi sıralanır.
4 5 13 14 23 83 87
Pivot
Soldan 13’den
büyük ve sağdan
13’den küçük
sayılar ortada
buluştuğu veya
çakıştığı için
pivotun yeri
bulunmuş olur ve
araya yerleştirilir.