递归合并中的行为异常

时间:2019-07-10 18:28:46

标签: c++ recursion mergesort

程序中的第二个递归传递了一个奇怪的数组,然后整个过程被破坏了。 我传递了一个数组及其大小,然后将其分为两个数组 left_arr right_arr 。我们对左数组继续上述过程,直到达到基本条件为止。在程序传递高,低值并在同一数组上进行更改时,存在类似的问题。 我想知道为什么我的代码会突然输出。忽略征服功能,因为在接近它之前由于发生错误而无法检查。

我尝试通过打印原始数组,左数组和右数组来调试代码,但找不到错误。
好的,我的第一个疑问是程序每次都在创建一个新数组,即按值传递吗? 而且,我该如何调试此类问题?

#include<bits/stdc++.h>

using namespace std;


 int conquer(int left_arr[],int right_arr[], int arr[]){
    int i=0,j=0,k=0;
    int length_left = sizeof(left_arr)/sizeof(left_arr[0]);
    int length_right = sizeof(right_arr)/sizeof(right_arr[0]);

                                               //int l = length_left + 
 length_right;

  while(i<length_left && j<length_right)
  {
      if(left_arr[i]<=right_arr[j])
      {
          arr[k++] = left_arr[i++];
      }
      else
      {
          arr[k++] = right_arr[j++];
      }
  }
  while(i<length_left)
  {
      arr[k++] = left_arr[i++];
  }

  while(j<length_right)
  {
      arr[k++] = right_arr[j++];
  }


                                                  for(int i=0; i<l;i++)
                                                  cout<<arr[i]<<" ";
                                                    cout<<endl;
return 0;
}

int divide(int *arr,int n)
{

 if(n<2)
  return 0;




  int mid=n/2;
  int x = n-mid;

  cout<<"  n ="<<n<<"  mid ="<<mid<<endl;

  int left_arr[mid];
  int right_arr[n-mid];             //for debug
                                    cout<<"arr:";
                                    for(int m=0;m<n;m++)
                                        cout<<arr[m]<<"  ";
                                    cout<<endl;


  for(int i=0;i<mid;i++)
      left_arr[i]=arr[i];          //for debug
                                   cout<<"Larr:";
                                   for(int k=0;k<mid;k++)
                                    cout<<left_arr[k]<<" ";

                                    cout<<endl;



  for(int j=mid;j<n;j++)
      right_arr[j] = arr[j];
                                cout<<"Rarr:";      //for debug
                                for(int j=mid;j<n;j++)
                                    cout<<right_arr[j]<<" ";

                                    cout<<endl<<endl;


   divide(left_arr,mid);
   divide(right_arr,x);

   //conquer(left_arr,right_arr,arr);


  return 0;
}


int main()
{
  int n,arr[]={2,5,4,6,1,8,3};


  divide(arr,7);

  for(int i=0;i<7;i++)
  {
      cout<<arr[i]<<" ";
  }
    return 0;
}
  

n = 7中= 3   arr:2 5 4 6 1 8 3   拉:2 5 4   拉尔:6 1 8 3

     

n = 3中= 1   arr:2 5 4   拉:2   拉尔:5 4

     

n = 2中= = 1 arr:7536080 5   larr:7536080   拉尔:5 //来自这里的错误

     

n = 4中= 2   地址:-1 0 4200483 6   larr:-1 0   拉尔:4200483 6

     

n = 2中= 1   arr:-1 0   larr:-1   拉尔:0

     

n = 2中= 1   arr:7536080 5   larr:7536080   拉尔:5

2 个答案:

答案 0 :(得分:1)

    for(int j=mid;j<n;j++)
    right_arr[j-mid] = arr[j];

并传递整个数组的大小

   conquer(left_arr,right_arr,arr,n);

在征服功能中,

    int length_left = n/2;
    int length_right = n-length_left;

,因为您无法从其指针中找到数组的长度。

答案 1 :(得分:0)

这是一个简单的数组访问错误(因此不确定行为)。

for(int j=mid;j<n;j++)
    right_arr[j] = arr[j];

应该是

for(int j=mid;j<n;j++)
    right_arr[j-mid] = arr[j];

此外,正如评论中已经指出的那样,您正在使用不合法C ++的可变长度数组(VLA)。