[英]Merge Sort Program
#include<stdio.h>
#include<stdlib.h>
void merge(int a[],int l,int m,int r)
{
int i,j,k;
int n1= m - l + 1;
int n2= r - m;
int L[n1],R[n2];
for(i=0;i<n1;i++)
L[i]=a[l+i];
for(j=0;j<n2;j++)
R[j]=a[m + 1+ j];
i=0;j=0;k=l;
while(i<n1 && j<n2)
{
if(L[i]<R[j])
{
a[k]=L[i];
i++;
}
else
{
a[k]=R[j];
j++;
}
k++;
}
while(i<n1)
{
a[k]=L[i];
i++;
k++;
}
while(j<n2)
{
a[k]=R[j];
j++;
k++;
}
}
void mergeSort(int a[],int l,int r)
{
if(l<r)
{
int m = l+(r-1)/2;
mergeSort(a,l,m);
mergeSort(a,m+1,r);
merge(a,l,m,r);
}
}
void printArray(int a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
int main()
{
int a[]= {
12,76,34,45,63,98
};
int n = sizeof(a)/sizeof(a[0]);
printf("The element entered in array ");
printArray(a,n);
mergeSort(a,0,n-1);
printf("The element after sorting ");
printArray(a,n);
return 0;
}
這是一個歸並排序程序。 如果有人可以解釋,為什么會出現運行時錯誤? 這個程序沒有錯誤
我已經嘗試了 10 次。 並且無法找到解決方案。
當您調用mergesort(a, 3, 5)
,會發生以下情況:
int m = l+(r-1)/2; // 3 + (5-1)/2 -> 3 + 4/2 -> 3 + 2 -> 5
mergeSort(a,l,m); // So this will call: mergesort(a, 3, 5) again
換句話說:無限循環。
也許你想要這個:
int m = (l+(r-1))/2;
^ ^
notice
那我是怎么發現這個bug的呢?
非常簡單 - 只需使用一些 printf 調試。
首先,我在mergesort
開始時添加了一個打印 - 如:
void mergeSort(int a[],int l,int r)
{
printf("mergesort %d %d\n", l, r); // Debug print
if(l<r)
{
int m = (l+(r-1))/2;
mergeSort(a,l,m);
mergeSort(a,m+1,r);
merge(a,l,m,r);
}
}
並得到輸出:
mergesort 3 5
mergesort 3 5
mergesort 3 5
...
...
這告訴我輸入值 3 和 5 存在無限循環。
然后我添加了一個m
的打印
void mergeSort(int a[],int l,int r)
{
printf("mergesort %d %d\n", l, r);
if(l<r)
{
int m = (l+(r-1))/2;
printf("m %d\n", m);
mergeSort(a,l,m);
mergeSort(a,m+1,r);
merge(a,l,m,r);
}
}
並得到輸出:
mergesort 3 5
m 5
mergesort 3 5
m 5
mergesort 3 5
m 5
所以顯然m
計算錯誤。
近距離看
int m = l+(r-1)/2;
很明顯,加法應該在除法之前。 一組(....)
丟失了。
希望您可以將這個調試示例用於您自己的調試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.