Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.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++_Mergesort - Fatal编程技术网

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;