1. 程式人生 > 其它 >就地並歸兩個有序表

就地並歸兩個有序表

任務描述
本關任務:程式設計實現兩個有序表的就地歸併。

相關知識
為了完成本關任務,你需要掌握:1.單鏈表的儲存;2.單鏈表的基本操作。

注意事項
1.已有的兩個有序表使用帶頭結點的單鏈表的儲存方式
2.歸併以後不允許表中有重複元素
3.就地歸併

程式設計要求
首先建立兩個有序單鏈表,就地歸併後輸出。

測試說明
平臺會對你編寫的程式碼進行測試:

7 //輸入第一個表的長度n1
2 4 7 8 10 13 18 //依次輸入n1個有序的元素
5 /輸入第一個表的長度n2
3 4 5 6 9 //依次輸入n2個有序的元素
預期輸出:
歸併表為:2 3 4 5 6 7 8 9 10 13 18

程式碼實現:

 #include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 20
void   Merge(int a[],int p, int q,int r)
{
    int result[N];
    int k=0;
    int i=p;
    int j=q+1;
    while(i<=q && j<=r){
        if(a[i]<a[j]){
            result[k++]=a[i++];
        }
        else {
            result[k++]=a[j++];
        }
    }
    if(i==q+1){
        while(j<=r){
            result[k++]=a[j++];
        }
    }
    if(j=r+1){
        while(i<=q){
            result[k++]=a[i++];
        }
    }
    for(j=0,i=p;j<k;i++,j++){
        a[i]=result[j];
    }

}
void Mergesort(int a[],int p, int r)
{
    int q;
    if(p<r)
    {
        q=(p+r)/2;
        Mergesort(a,p,q);
        Mergesort(a,q+1,r);
        Merge(a,p,q,r);
    }

}

int main( void )
{
    int a[]={2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 18};
    Mergesort(a,0,9);
    int m=0;
    for(m=0;m<11;m++)
    printf("%d ",a[m]);
    return 0;
}