相同的代码但奇怪的行为
Same code but Strange behaviour
这是我实现归并排序的代码,完全没有显示错误
也没有输出:
#include<iostream>
using namespace std;
void merge(int arr[],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]=arr[i+l];
}
for(j=0;j<n2;j++)
{
R[j]=arr[m+1+j];
}
i=0;
j=0;
k=1;
while(i<n1 && j<n2)
{
if(L[i]<=R[j])
{
arr[k]=L[i];
i++;
}
else
{
arr[k]=R[j];
j++;
}
k++;
}
while(i<n1)
{
arr[k]=L[i];
i++;
k++;
}
while(j<n2)
{
arr[k]=R[j];
j++;
k++;
}
}
void mergeSort(int arr[], int l, int r)
{
if(l < r)
{
int m = l+(r-1)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
void printArray(int A[],int size)
{
int i;
for( i=0;i<size;i++)
cout<<A[i]<<" ";
}
int main()
{
int arr[]={12,65,34,78,90,65,34};
int arr_size = sizeof(arr)/sizeof(arr[0]);
cout<<"Given array is \n";
printArray(arr, arr_size);
mergeSort(arr, 0, arr_size - 1);
cout<<"\nSorted array is \n";
printArray(arr, arr_size);
return 0;
}
现在这是一段代码,这就是问题所在:
void mergeSort(int arr[], int l, int r)
{
if (l < r)
{
int m = l+(r-l)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
如果我用上面程序的 mergeSort() 替换这个 mergeSort() 代码,
该程序给出了输出。
但是看看,两个 mergeSort() 代码是相同的(在程序代码以及提到的 mergeSort() 代码中)
link 为原码 ===> http://cpp.sh/6zdip
link替换为mergeSort后的代码====> http://cpp.sh/7lfo
这是我遇到过的最奇怪的问题。
代码不一样
on your original code: int m = l+(r-1)/2;
on the working code: int m = l+(r-l)/2;
小写字母 L 看起来像“1”,但实际上不是。
现在,尝试一件事:使代码的空间保持一致(通过 运行 clang-format 在两个代码上)然后使用 diff 应用程序来验证代码和 运行 一个.
当我这样做时很容易发现:
> int m = l + (r - 1) / 2;
> ---
> int m = l + (r - l) / 2;
这是我实现归并排序的代码,完全没有显示错误 也没有输出:
#include<iostream>
using namespace std;
void merge(int arr[],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]=arr[i+l];
}
for(j=0;j<n2;j++)
{
R[j]=arr[m+1+j];
}
i=0;
j=0;
k=1;
while(i<n1 && j<n2)
{
if(L[i]<=R[j])
{
arr[k]=L[i];
i++;
}
else
{
arr[k]=R[j];
j++;
}
k++;
}
while(i<n1)
{
arr[k]=L[i];
i++;
k++;
}
while(j<n2)
{
arr[k]=R[j];
j++;
k++;
}
}
void mergeSort(int arr[], int l, int r)
{
if(l < r)
{
int m = l+(r-1)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
void printArray(int A[],int size)
{
int i;
for( i=0;i<size;i++)
cout<<A[i]<<" ";
}
int main()
{
int arr[]={12,65,34,78,90,65,34};
int arr_size = sizeof(arr)/sizeof(arr[0]);
cout<<"Given array is \n";
printArray(arr, arr_size);
mergeSort(arr, 0, arr_size - 1);
cout<<"\nSorted array is \n";
printArray(arr, arr_size);
return 0;
}
现在这是一段代码,这就是问题所在:
void mergeSort(int arr[], int l, int r)
{
if (l < r)
{
int m = l+(r-l)/2;
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
如果我用上面程序的 mergeSort() 替换这个 mergeSort() 代码, 该程序给出了输出。 但是看看,两个 mergeSort() 代码是相同的(在程序代码以及提到的 mergeSort() 代码中)
link 为原码 ===> http://cpp.sh/6zdip
link替换为mergeSort后的代码====> http://cpp.sh/7lfo
这是我遇到过的最奇怪的问题。
代码不一样
on your original code: int m = l+(r-1)/2;
on the working code: int m = l+(r-l)/2;
小写字母 L 看起来像“1”,但实际上不是。
现在,尝试一件事:使代码的空间保持一致(通过 运行 clang-format 在两个代码上)然后使用 diff 应用程序来验证代码和 运行 一个.
当我这样做时很容易发现:
> int m = l + (r - 1) / 2;
> ---
> int m = l + (r - l) / 2;