使用数组而不是向量合并排序实现

时间:2011-11-16 21:15:16

标签: c++ mergesort

我正在尝试使用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 );
    }
}

3 个答案:

答案 0 :(得分:3)

您已声明了两组数组。两个名为arr1,两个名为arr2。这些数据添加了一些数据,但随后它们超出了范围并且未使用数据。这是警告的来源。

然后,您尝试在其范围之外使用arr1arr2 - 在if块之外。这是错误的来源。在Sortmerge检查之前,这些数组必须在函数顶部(n % 2)声明一次。

答案 1 :(得分:1)

写作时

if (n%2==0)
{
    int arr1[n/2]; //<-------here
    int arr2[n/2]; //<-------here
    ..........
}

arr1arr2仅对该范围内的代码可见({}之间)。因此,您有两组不同的arr1arr2,一组用于奇数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;