错误:一元“ *”的无效类型参数(具有“ int”):使用mergesort计算数组中的反转数

时间:2018-06-22 11:45:42

标签: c++ arrays pointers debugging mergesort

我正在尝试编写此代码以使用合并排序技术计算数组中的反转次数。我从GeeksForGeeks获得了参考。即使我没有明确地使用指针,也遇到了这个错误。

  

错误:一元“ *”(具有“ int”)的无效类型参数

下面是我的代码。

#include <bits/stdc++.h>
using namespace std;

int mergeSort(int arr[], int temp[], int l, int r){
    int invcount = 0;

    if(l<r){
        int m = (l+r)/2;
        invcount += mergeSort(arr, temp, l, m);
        invcount += mergeSort(arr, temp, m+1, r);

        invcount += merge(arr, temp, l, m, r);
    }
    return invcount;
}

int merge(int arr[], int temp[], int l, int m, int r){
    int invcount = 0;
    int k = l;
    int i = l, j = m+1;

    while(true){
        if(i>m){
            while(j<=r){
                temp[k] = arr[j];
                k++;
                j++;
            }
            break;
        }
        else if(j>r){
            while(i<=m){
                temp[k] = arr[i];
                k++;
                i++;
            }
            break;
        }

        if(arr[i] > arr[j]){
            temp[k] = arr[j];
            k++;
            j++;
            invcount += m-i+1;
        }
        else{
            temp[k] = arr[i];
            k++;
            i++;
        }
    }

    for(i=l; i<=r; i++){
        arr[i] = temp[i];
    }
    return invcount;
}

int main(int argv, char** args)
{
    // int arr[] = {1, 20, 6, 4, 5};
    int arr[] = {2, 4, 1, 3, 5};
    int n = sizeof(arr)/sizeof(arr[0]);
    int *temp = new int[n];
    printf(" Number of inversions are %d \n", mergeSort(arr, temp, 0, n-1));
    // getchar();
    return 0;
}

有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

问题很可能是您使用#include <bits/stdc++.h>并致电merge的原因。

问题在于,<algorithm>标头中定义了一个std::merge函数,而<bits/stdc++.h>标头中包含<algorithm>。另外,您有

using namespace std;

使问题进一步复杂化。您实际上是在尝试调用std::merge而不是自己的merge函数,这都是由于std命名空间被带入程序。 std::merge函数需要的参数类型与传递给自己的merge函数的参数类型不同,因此会出错。


解决方案-停止使用#include <bits/stdc++.h>。包括正确的标准C ++标头,而不要包含此标头。正确的标题为:

#include <cstdio>

然后,您将(或应该)遇到另一个错误,即正在调用merge,但是编译器不知道该错误。在这种情况下,您可以声明merge函数并将其放在mergeSort函数之前

// declare the merge() function here
int merge(int arr[], int temp[], int l, int m, int r);

int mergeSort(int arr[], int temp[], int l, int r)
{
   int invcount = 0;
   if(l<r)  {
     int m = (l+r)/2;
     invcount += mergeSort(arr, temp, l, m);
     invcount += mergeSort(arr, temp, m+1, r);
     invcount += merge(arr, temp, l, m, r);
  }
  return invcount;
}

// implement merge() here
int merge(int arr[], int temp[], int l, int m, int r)
{
   //...
}

或将整个merge函数实现移到mergeSort函数之前。