我正在尝试使用merge-sort
而不是arrays
来实现vectors
算法,并且我在我的两个函数之一中遇到了一些错误。这两个函数的代码如下。
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 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 );
}
}
答案 0 :(得分:3)
您已声明了两组数组。两个名为arr1
,两个名为arr2
。这些数据添加了一些数据,但随后它们超出了范围并且未使用数据。这是警告的来源。
然后,您尝试在其范围之外使用arr1
和arr2
- 在if块之外。这是错误的来源。在Sortmerge
检查之前,这些数组必须在函数顶部(n % 2
)声明一次。
答案 1 :(得分:1)
写作时
if (n%2==0)
{
int arr1[n/2]; //<-------here
int arr2[n/2]; //<-------here
..........
}
arr1
和arr2
仅对该范围内的代码可见({}
之间)。因此,您有两组不同的arr1
和arr2
,一组用于奇数n
,另一组用于偶数n
,但Sortmerge(...)
无法看到这些if (n%2==0){
....
}
if (n%2!=0){
....
}
调用
此外,您可以替换
if (n%2==0){
....
}
else{
....
}
与
{{1}}
答案 2 :(得分:1)
这似乎很正常。
您在 if 语句中声明了您的两个数组。变量的范围仅适用于此语句。 替换:
if (n%2==0)
{
int arr1[n/2]; //<-------here
int arr2[n/2]; //<-------here
int k=0;
int l=0;
通过
int arr1[n/2]; //<-------here
int arr2[n/2]; //<-------here
if (n%2==0)
{
int k=0;
int l=0;