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