Merge Sort C Kodu


Yalan söylemeyim, Merge Sort C Kodu anlatımını yapmak canımı çıkardı. Merge Sort Algoritması üzerine hazırladığım Merge Sort C Kodu Nasıl Yazılır konusundan sonra bir de sıfırdan Merge Sort Hazır C Kodu hazırladım. Toplamda Merge Sort konusunu 3 makale ile anlatmış oldum. Bu üçüncüsü daha doğrusu :) Zaten Her algoritma için 3 makale şart gibi bir şey. Şunu önemle belirtiyorum. Bütün dersi ben kendim hazırlıyorum, kodları da kendi ellerimle yazıp test ediyorum. Yani her yeri emek dolu bu yazıların. Neyse kendimi övmeyi bırakıp kodları sizinle paylaşayım :)

Merge Sort Hazır C Kodu (kopyala yapıştır çalıştır)


#include <stdio.h>

#include<stdlib.h>


void merge(int dizi[], int left, int mid, int right)

{

    int i, j, k; // Sayac degerleri



    int n1 = mid-left+1; // sol dizi boyutu

    int n2 = right-mid; // sag dizi boyutu



    int solDizi[n1], sagDizi[n2]; // sol ve sag diziler

   

    /* Aşagideki iki for dongusu alt dizileri olusturuyor */

    for(i=0; i<n1; i++)

        solDizi[i] = dizi[left+i];

    for(j=0; j<n2; j++)

        sagDizi[j] = dizi[mid+1+j];



    /* Sayaclarimiz degistigi icin tekrardan sifirladim. Ama k degerine left degerini verdim... */

    i=0;

    j=0;

    k=left;



    while(i < n1 && j < n2) // soldaki ve sagdaki dizilerin boyutunu asmamasi icin kontrol yaptık

    {

        if(solDizi[i] <= sagDizi[j]) // sol dizinin ilk elemani sag diziden kucuk veya esitse

        {

            dizi[k] = solDizi[i]; // ustteki diziye soldaki dizinin elemanini atiyoruz

            i++;

        }

        else

        {

            dizi[k] = sagDizi[j]; // degilse sagdaki dizinin elemanini atiyoruz

            j++;

        }

        k++;

    }

   

    /* Atama islemleri sonucunda bir dizide eleman kalmissa onlari sira ile yerlestiriyoruz

    iki dongu de ayni isi yapiyor, biri sol dizi icin digeri sag */

    while(i < n1)

    {

        dizi[k] = solDizi[i];

        i++;

        k++;

    }



    while(j < n2)

    {

        dizi[k] = sagDizi[j];

        j++;

        k++;

    }



}



void mergeSort(int dizi[], int left, int right) // dizi elemanlarini surekli ikiye bolen fonksiyon

{

    if(left<right)

    {

        int mid = left + (right-left)/2; // Dizinin ortasindaki elemani buluyoruz.



        mergeSort(dizi, left, mid); // Dizinin sol tarafini ikiye boluyoruz

        mergeSort(dizi, mid+1, right); // dizinin sag tarafini ikiye boluyoruz.



        merge(dizi, left, mid, right); //dizinin bolunmus parcalarini siralasin diye mergeSort fonksiyonuna pasliyoruz

    }



}





void main()

{

    int i;

    int boyut;

    printf("Kac Adet Sayi gireceksiniz? ...");

    scanf("%d", &boyut);



    int dizi[boyut-1];



    for(i=0; i<boyut; i++)

    {

        printf("\nLutfen %d. sayiyi giriniz... ", i+1);

        scanf("%d", &dizi[i]);

    }



    printf("\n Sayilarinizin Siralanmamis Hali Asagidaki Gibidir...\n");

    for(i=0; i<boyut; i++)

    {

        printf("\n%d\n", dizi[i]);

    }





    mergeSort(dizi, 0, boyut-1);



    printf("Sayilarinizin Siralandiktan Sonraki Hali Asagidaki Gibidir\n");

    for(i=0; i<boyut; i++)

    {

        printf("\n%d\n", dizi[i]);

    }



}


Etiketler: , , , , ,