程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程綜合問答 >> c語言-哪位大神知道我這個歸並排序的代碼究竟哪裡出了問題?

c語言-哪位大神知道我這個歸並排序的代碼究竟哪裡出了問題?

編輯:編程綜合問答
哪位大神知道我這個歸並排序的代碼究竟哪裡出了問題?

代碼如下:
找了好久,實在找不出哪裡的問題:

 #include<stdio.h>
void merge(int s[],int a[],int start,int mid,int end) 
{
    int i=start;
    int j=mid+1;
    int k=start;
    while(i<=mid && j<=end) {
        if(a[i]<a[j]) {
            s[k++]=a[i++];
        } else {
            s[k++]=a[j++];
        }
    }
    if(i<=mid) {
        s[k++]=a[i++];
    }
    if(j<=end) {
        s[k++]=a[j++];
    }
}

void merge_sort(int s[],int a[],int start,int end) 
{
    int t[20]; 
    int mid; 
    if(start==end) {
        s[start]=a[start];
    } else {
        mid=(start+end)/2;
        merge_sort(t,a,start,mid);
        merge_sort(t,a,mid+1,end);
        merge(s,t,start,mid,end);
    }
}

int main()
{
    int i;
    int n=5;
    int a[n],s[n];
    printf("Enter %d nimbers: \n",n);
    for(i=0;i<n;i++) {
        scanf("%d",&a[i]);
    }
    printf("\n");
    merge_sort(s,a,0,n-1);
    printf("The sorted order is: \n");
    for(i=0;i<n;i++) {
        printf("%5d",s[i]);
    }
    printf("\n");
    return 0;
}

最佳回答:


我看到你這個問題,剛開始還以為是二分法,摸了半天瞎。後來發現時歸並排序,然後我發現我也不會,就調你的程序,查資料什麼事歸並排序。
然後發現其實問題很簡單,
while(i<=mid) {
s[k++]=a[i++];
}
while(j<=end) {
s[k++]=a[j++];
}
這個地方粗一看覺得是對的,但是後來我細想,要是1個排序的數組:4 5 3。然後經過你的這段程序,
while(i<=mid && j<=end) {
if(a[i]<a[j]) {
s[k++]=a[i++];
} else {
s[k++]=a[j++];
}
}

Enter 5 nimbers:
5 4 3 2 1

0-4
0-2
0-1
0-0
1-1
0 0 1
4 5 0 0 0
2-2
0 1 2
3 4 0 0 0
3-4
3-3
4-4
3 3 4
3 4 0 1 2
0 2 4
1 2 3 0 0
The sorted order is:
1 2 3 0 0
第一次,把三排到最開始,i ++ 了,while就退出了,這是還有4 5沒有合並,然後你下面的是if(),這就造成,最多只能加一個元素的情況,把5給
丟了。現在是3 4,然後合並了 1 2,成了 3 4 0 1 2,在排序的時候,把 1 2 先拍, 這時候while退出,然後 就合並了一個 3 , 4 給丟了。換成 while
就行了。還有,定義數組要規范,然後還要初始化,這是規范化操作。我貼上了測試的數據。不知道你看不看得懂。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved