C++ 使用数组而不是向量合并排序实现
我试图使用C++ 使用数组而不是向量合并排序实现,c++,mergesort,C++,Mergesort,我试图使用数组而不是向量来实现合并排序算法,我的两个函数中的一个出现了一些错误。这两个函数的代码如下所示 void Merge(int ar[], int ar1[], int ar2[], int n1, int n2) { int p1 = 0; int p2 = 0; int p3 = 0; while (p1 < n1 && p2 < n2) { if (ar1[p1] < ar2[p2])
数组
而不是向量
来实现合并排序
算法,我的两个函数中的一个出现了一些错误。这两个函数的代码如下所示
void Merge(int ar[], int ar1[], int ar2[], int n1, int n2) {
int p1 = 0;
int p2 = 0;
int p3 = 0;
while (p1 < n1 && p2 < n2) {
if (ar1[p1] < ar2[p2])
{
ar[p3]=ar1[p1];
p3++;
p1++;
}
else
{
ar[p3]=ar2[p2];
p3++;
p2++;
}
}
while (p1 < n1)
{
ar[p3]=ar1[p1];
p3++;
p1++;
}
while (p2 < n2)
{
ar[p3]=ar2[p2];
p3++;
p2++;
}
}
void合并(int-ar[],int-ar1[],int-ar2[],int-n1,int-n2){
int p1=0;
int p2=0;
int p3=0;
而(p1
我用下面的代码解决了我面临的问题
void Sortmerge(int array[],int n) {
if (n <= 1) return;
if (n % 2 == 0)
{
int arr1[n/2];
int arr2[n/2];
int k=0;
int l=0;
for (int i=0;i<n;i++)
{
if (i<(n/2))
{
arr1[k++]=array[i];
}
else
{
arr2[l++]=array[i];
}
}
Sortmerge(arr1,n/2);
Sortmerge(arr2,n/2);
for (int i=0;i<n;i++)
{
array[i]=0;
}
Merge(array, arr1, arr2,n/2,n/2);
}
if (n%2!=0)
{
int arr1[(n-1)/2];
int arr2[(n+1)/2];
int k=0;
int l=0;
for (int i=0;i<n;i++)
{
if (i<((n-1)/2))
{
arr1[k++]=array[i];
}
else
{
arr2[l++]=array[i];
}
}
Sortmerge(arr1,(n-1)/2);
Sortmerge(arr2,(n+1)/2);
for (int i=0;i<n;i++)
{
array[i]=0;
}
Merge(array, arr1, arr2,(n-1)/2,(n+1)/2 );
}
}
void Sortmerge(int数组[],int n){
如果(n您已经声明了两组数组。两组名为arr1
和两组名为arr2
。这些数组中添加了一些数据,但是它们超出了范围,并且没有使用这些数据。这就是警告的来源
然后尝试在其作用域之外使用arr1
和arr2
——在if块之外。这是错误的根源。这些数组必须声明一次,可能在函数的顶部(Sortmerge
),在您的n%2
检查之前。您已经声明了两组数组。两组名为arr1
和两组名为arr2
。这些数组中添加了一些数据,但是它们超出了范围,并且没有使用数据。这就是警告的来源
然后尝试在其作用域之外使用arr1
和arr2
,即在if块之外。这是错误的根源。在执行n%2
检查之前,这些数组必须声明一次,很可能在函数的顶部(Sortmerge
)
if (n%2==0)
{
int arr1[n/2]; //<-------here
int arr2[n/2]; //<-------here
..........
}
与
当你写作时
if (n%2==0)
{
int arr1[n/2]; //<-------here
int arr2[n/2]; //<-------here
..........
}
与
这似乎很正常
在if语句中声明两个数组。变量的作用域仅适用于此语句。
替换:
if (n%2==0)
{
int arr1[n/2]; //<-------here
int arr2[n/2]; //<-------here
int k=0;
int l=0;
if(n%2==0)
{
int arr1[n/2];//这似乎很正常
在if语句中声明两个数组。变量的作用域仅适用于此语句。
替换:
if (n%2==0)
{
int arr1[n/2]; //<-------here
int arr2[n/2]; //<-------here
int k=0;
int l=0;
if(n%2==0)
{
In ARR1[N/2 ];/或知道可变大小的数组不是标准的C++,所以有些编译器不会接受它们。看起来你使用的是GCC,它是这样的。<代码> siZeof(AR1)/siZeof(int)< /C>不做你想要的,因为<代码> siZeof(AR1)< /C> >与<代码> sieZof(int *)相同。<代码>注意,可变大小的数组不是标准的C++,所以有些编译器不会接受它们。看起来你使用的是GCC,它是.<代码> siZeof(AR1)/siZeof(int)< /C>不做你想要的,因为<代码> siZeof(AR1)< /C> >与<代码> sieZof(int *)< /> >相同。
int arr1[n/2]; //<-------here
int arr2[n/2]; //<-------here
if (n%2==0)
{
int k=0;
int l=0;