相同的代码,但奇怪的行为

时间:2017-06-06 09:20:36

标签: c++11 mergesort

这是关于合并排序实现的代码,它根本没有显示任何错误 并且没有输出:

#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()代码)

链接到原始代码===&gt; http://cpp.sh/6zdip

替换mergeSort后链接到代码====&gt; http://cpp.sh/7lfo

这是我遇到过的最奇怪的问题。

1 个答案:

答案 0 :(得分:1)

它的代码不一样。

  

原始代码:int m = l +(r-1)/ 2;

     

关于工作代码:int m = l +(r-l)/ 2;

字母L小写看起来像&#39; 1&#39;,但它不是。

现在,尝试一件事:使代码的空间保持一致(通过在两个代码上运行clang-format),然后使用diff应用程序验证代码和正在运行的代码之间的差异。

当我这样做时很容易发现:

> int m = l + (r - 1) / 2;
>  ---
> int m = l + (r - l) / 2;