【C語言程序設計】C語言的歸並排序算法!


用歸並排序法對一組數據由小到大進行排序,數據分別為 695、458、362、789、12、 15、163、23、2、986。

 

實現過程:

    (1) 自定義函數 merge(),實現一次歸並排序。

    (2) 自定義函數 merge_sort(),實現歸並排序。

 

程序代碼如下:

#include <stdio.h>

int merge(int r[],int s[],int x1,int x2,int x3)    //自定義實現一次歸並樣序的函數

{

    int i,j,k;

    i=x1;    //第一部分的開始位置

    j=x2+1;  //第二部分的開始位置

    k=x1;

    while((i<=x2)&&(j<=x3))    //當i和j都在兩個要合並的部分中時

        if(r[i]<=r[j])    //篩選兩部分中較小的元素放到數組s中

        {

            s[k] = r[i];

            i++;

            k++;

        }

        else

        {

            s[k]=r[j];

            j++;

            k++;

        }

        while(i<=x2)    //將x1〜x2范圍內未比較的數順次加到數組r中

            s[k++]=r[i++];

        while(j<=x3) //將x2+l〜x3范圍內未比較的數順次加到數組r中

            s[k++]=r[j++];

    return 0;

}

int merge_sort(int r[],int s[],int m,int n)

{

    int p;

    int t[20];

    if(m==n)

        s[m]=r[m];

    else

    {

        p=(m+n)/2;

        merge_sort(r,t,m,p);    //遞歸調用merge_soit()函數將r[m]〜r[p]歸並成有序的t[m]〜t[p]

        merge_sort(r,t,p+1,n);    //遞歸一調用merge_sort()函數將r[p+l]〜r[n]歸並成有序的t[p+l]〜t[n]

        merge(t,s,m,p,n);    //調用函數將前兩部分歸並到s[m]〜s[n】*/

    }

    return 0;

}

int main()

{

    int a[11];

    int i;

    printf("請輸入10個數:\n");

    for(i=1;i<=10;i++)

        scanf("%d",&a[i]);    //從鍵盤中輸入10個數

    merge_sort(a,a,1,10);    //調用merge_sort()函數進行歸並排序

    printf("排序后的順序是:\n");

    for(i=1;i<=10;i++)

        printf("%5d",a[i]);    //輸出排序后的數據

    printf("\n");

    return 0;

}

 

運行結果:

請輸入10個數:

695 458 362 789 12 15 163 23 2 986

排序后的順序是:

2   12   15   23  163  362  458  695  789  986

 

技術要點:

歸並是將兩個或多個存序記錄序列合並成一個有序序列。

歸並方法有多種,一次對兩個有序記錄序列進行歸並,稱為路歸並排序,也有三路歸並排序及多路歸並排序。本實例是二路歸並排序,基本方法如下:

    (1) 將 n 個記錄看成是 n 個長度為 1 的有序子表。

    (2) 將兩兩相鄰時有序無表進行歸並。

    (3) 重復執行步驟 (2) 直到歸並成一個長度為 n 的有序表。


 

不管你是轉行也好,初學也罷,進階也可,如果你想學編程,進階程序員~

【值得關注】我的 編程學習交流俱樂部!【點擊進入】


 


免責聲明!

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



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