Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 合并排序中的递归行为异常_C++_Recursion_Mergesort - Fatal编程技术网

C++ 合并排序中的递归行为异常

C++ 合并排序中的递归行为异常,c++,recursion,mergesort,C++,Recursion,Mergesort,我程序中的第二个递归传递了一个奇怪的数组,然后整个过程都被破坏了。 我传递一个数组及其大小,然后将其分为两个数组left\u arr和right\u arr。我们对左数组继续上述过程,直到它达到基本条件。在程序传递高、低值并在同一数组上进行更改时,也存在类似的问题。 我想知道为什么我的代码会给出突然的输出。忽略征服函数,因为我无法检查,因为在接近它之前发生了错误 我试图通过打印原始数组、左数组和右数组来调试代码,但找不到错误。 好的,我的第一个疑问是程序每次都在创建一个新数组,即传递值? 我如何

我程序中的第二个递归传递了一个奇怪的数组,然后整个过程都被破坏了。 我传递一个数组及其大小,然后将其分为两个数组left\u arrright\u 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;
}
#包括
使用名称空间std;
int征服(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=长度_左+
长度(右);;

而(i这是一个简单的数组访问越界错误(因此是未定义的行为)

for(int j=mid;jDo

在功能上,

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

因为从指针中找不到数组的长度。 >代码左> [t];<代码>不是标准C++,除非<代码> MID是常量表达式。这可能是或可能不是问题的一部分,但不应使用非标准语言扩展。<代码> int LangthyLe= sisiof(LeftTyr)/siZeof(LeftTyr ARR(0))
是一个bug。至少是标准的
c++
sizeof(left_arr)
是指针的大小而不是数组的大小。@OP您知道,如果您使用
std::vector
及其工具,例如
At()
调用以确定边界访问问题。即使使用
size()
也可以防止提到的
sizeof
错误。这就是为什么VLA语法对您的健康有害的原因。它隐藏错误,更糟糕的是,如果条目数过多(堆栈溢出),它会导致错误.
\include
使用命名空间std;
。请务必小心。请同时查看征服函数。排序后,我的最终输出是1 0 2 0 1 8 3。@HarshalSharma此代码不正确
int length\u left=sizeof(left\u arr)/sizeof(left\u arr[0])“<代码>左LoTyrAR/<代码>是指针而不是数组。所以<代码> sieZof(LeftTyr)/Cux>是4(或者是在64位系统上的8)。它不是原始数组的大小。数组是C++中的垃圾,应该使用向量,但是如果必须使用数组,那么应该正确地学习它们能做什么和不能做什么。
for(int j=mid;j<n;j++)
    right_arr[j-mid] = arr[j];
    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;