Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz
Hızlı sıralama (quick sort) algoritması En çok tercih edilen sıralama algoritmalarından biridir. Bu algoritmadaki çözüm yaklaşım “parçala ve çözümle” ilkesine göre çalışmaktadır. Öncelikle sıralanacak diziden belirli bir kritere göre parçalayıcı bir eleman (örneğin orta elemen) seçilir. Sıralanacak dizi bu elemandan küçük eşit ve bu elemandan büyük olacak şekilde iki alt diziye bölünür. Bu işlemin ardından yukarıdaki işlem her alt dizi için özyinelemeli olarak tekrarlanır.
Hızlı sıralama (quick sort) algoritması C programlamada fonksiyon kavramını incelediğimiz için bu problemin çözümünde yapısal programlamanın çözümü daha kolay alt problemlere (modüllere) bölünme ilkesinden faydalanabiliriz. Her bir modülü daha kolay çözülebilir bir altprogram (yordam) olarak ele alabiliriz. Bu işlem, aşağıdaki şekilde de görülebileceği gibi her bir modülün kolaylıkla çözülebileceği seviyeye kadar devam eder.
#include void oku (void); void bol(int,int); void hsirala(int,int); void yaz (void); int i,n,ort; int A[100]; void main(void) { oku(); hsirala(1,n); yaz(); } void oku(void) { clrscr(); printf("dizi eleman sayisini giriniz: "); scanf("%d",&n); for(i=1;i<=n;i++) {printf("dizi elemanini girin: "); scanf("%d",&A[i]); } } void bol(int x,int y) { int alt,ust,g,eksen; eksen=A[(x+y)/2]; alt=x; ust=y; do { while(A[alt]<eksen) alt++; while(A[ust]>eksen) ust--; if(alt<=ust) { if(alt!=ust) { g=A[alt]; A[alt]=A[ust]; A[ust]=g; } alt++; ust--; } } while(alt<=ust); ort=ust; } void hsirala(int sol, int sag) {if (sol<sag) { bol(sol,sag); if(sol<ort) hsirala(sol, ort); if(sag>ort+1) hsirala(ort+1,sag); }
void yaz(void) {clrscr(); for(i=1;i<=n;i++) printf("%d ",A[i]); printf(" \n"); getch(); }
Birleştirmeli sıralama (merge sort) algoritması Bu sıralama algoritması “parçala çözümle ve birleştir” ilkesini kullanır. Bu algoritmada sıralanacak olan dizi ortadan iki alt diziye bölünür. Bu algoritmada öncelikle sıralanacak dizi birer elemandan oluşan alt diziler elde edilene kadar özyinelemeli olarak ikiye bölünür. Ardından alt diziler sıralı olarak birleştirilerek sıralı dizi elde edilir; Bu problemin çözümünde yapısal programlamanın çözümü daha kolay alt problemlere (modüllere) bölünme ilkesinden faydalanabiliriz. Her bir modülü daha kolay çözülebilir bir altprogram (yordam) olarak ele alabiliriz. Bu işlem, aşağıdaki şekilde de görülebileceği gibi her bir modülün kolaylıkla çözülebileceği seviyeye kadar devam eder.
#include void oku (void); void bol(int,int); void birles(int,int,int); void yaz (void); int n; int A[100]; void main(void) { oku(); bol(1,n); yaz(); } void oku(void) { int i; clrscr(); printf("dizi eleman sayisini giriniz: "); scanf("%d",&n); for(i=1;i<=n;i++) {printf("dizi elemanini girin: "); scanf("%d",&A[i]); } } void bol(int alt,int ust) { int ort,alts,usts; if(alt<ust) { alts=alt; usts=ust; ort=(alts+usts)/2; bol(alts,ort); bol(ort+1,usts); birles(alts,ort,usts); } }
void birles(int alts, int ort, int usts) { int i,ass,usb,g; ass=ort; usb=ort+1; while ((alts<=ass)&&(usb<=u sts)) { if (A[alts]<A[usb]) alts++; else { g=A[usb]; for (i=usb- 1;i>=alts;i--) A[i+1]=A[i]; A[alts]=g; alts++;ass++;usb++; } } } void yaz(void) {int i; clrscr(); for(i=1;i<=n;i++) printf("%d ",A[i]); printf(" \n"); getch(); }
Kümeleme/yığın sıralama (heap sort) algoritması. Kümeleme(heap) veri yapısı ikili ağaçların özel bir halidir. Bu yapıda her ebeveyn düğümün çocuk düğümlerin kendisinden küçük yada kendisine eşit olması kuralı esas alınır (bunun terside kullanılabilir).
Oluşan ağaç (heap) yapısının dizilerde gösterimi ise aşağıdaki şekilde olur; Ağacın en büyük değerli elemanı (root node: kök düğüm) her zaman dizinin ilk elemanıdır. Dizi üzerinde her i. ebeveyn düğümün çocuk düğümleri 2i. ve (2i+1). konumda olacaktır. Verilen bir diziden kümeleme (heap) oluşturmak için her i. ebeveyn düğümle 2i. ve (2i+1). çocuk düğümleri karşılaştırıp ebeveyn düğümden büyük olan çocuk düğümleri ebeveyn düğümle yer değiştirmemiz gerekecektir. Bu işlemi dizinin orta elemanına kadar yapmamız yeterlidir. Yarıdan sonraki diğer elemanlar ebeveyn olmayan çocuk elemanlar olduğundan bunlar için işlem yapmaya gerek yoktur.
Elde edilen kümelenmiş diziyi sıralamak için ise, kümenin ilk elemanın dizinin en büyük elemanı olduğunu bildiğimizden dizinin ilk elemanı ile son elemanının yerini değiştirerek en büyük elemanı sona atmış oluruz. Sonuncu elemanı içermeyen yeni dizi tekrar kümeleme işlemine tabi tutulur. Bu yeni dizide de ilk eleman ile son elemanın yeri değiştirilir. Bu yineleme işlemi dizinin boyu bir oluncaya kadar devam eder. Bu problemin çözümünde de özyinelemeli modüler yordamlar kullanılacaktır.
Doç. Dr. Cemil Öz SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz