代碼如下:
找了好久,實在找不出哪裡的問題:
#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
就行了。還有,定義數組要規范,然後還要初始化,這是規范化操作。我貼上了測試的數據。不知道你看不看得懂。