C語言歸並排序


這篇文章是學習了小甲魚-數據結構與算法結合自考教材編寫出的代碼,希望自己逐漸在算法造詣上能更上一層樓。

歸並排序(遞歸實現)

 

“歸並”一詞在中文含義中就是合並的意思,而在數據結構中的定義是將兩個或者兩個以上的有序表組合成一個新的有序表,就叫歸並。

 

歸並排序(Merge Sort)就是利用歸並的思想實現的排序方法。它的原理是假設初始序列有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然后兩兩歸並,得到⌈n/2⌉個長度為2或1的有序子序列;再兩兩歸並,……,如此重復,直至得到一個長度為n的有序序列為止,這種排序方法稱為2路歸並排序。

 

#include <stdio.h>
#define MAXSIZE 10

// 遞歸的方式實現歸並排序

// 實現歸並,並把結果存放到list1
void merging(int *list1, int list1_size, int *list2, int list2_size)
{
    int i,j,k, m;
    int temp[MAXSIZE];

    i = j = k = 0;

    while(i < list1_size && j < list2_size)
    {
        if(list1[i] < list2[j])
        {
            temp[k] = list1[i];
            k++;
            i++;
        }
        else
        {
            temp[k++] = list2[j++];
        }
    }

    while(i < list1_size)
    {
        temp[k++] = list1[i++];
    }

    while(j < list2_size)
    {
        temp[k++] = list2[j++];
    }

    for(m = 0;m < (list1_size + list2_size);m++)
    {
        list1[m] = temp[m];
    }
}

void MergeSort(int k[], int n)
{
    if(n > 1)
    {
        /*
        *list1是左半部分,list2是右半部分
        */
        int *list1 = k;
        int list1_size = n/2;
        int *list2 = k + list1_size;
        int list2_size = n - list1_size;

        MergeSort(list1, list1_size);
        MergeSort(list2, list2_size);

        // 把兩個合在一起
        merging(list1, list1_size, list2, list2_size);
    }

}

int main()
{
    int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};

    MergeSort(a, 10);

    printf("排序后的結果是:");

    for(i = 0;i < 10;i++)
    {
        printf("%d", a[i]);
    }
    printf("\n\n");

    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM