排序数组 - 不断收到错误。

时间:2014-02-25 15:58:05

标签: c++ arrays sorting

我有一个c ++中的项目-i接收一个数组,我需要构建一个程序,只打印出超过其索引的3倍以上的数字。 例如,对于阵列6,4,4,5,2,4,4,3,5,5 - 它将打印: 4:1,2,5,6 5:3,8,9

并且最重要 - 它应该不超过O(n * log n)。

sooo ....对于这个问题......

这是我不断得到的错误:

    1>HW - 2.obj : error LNK2019: unresolved external symbol "void __cdecl mergeSortP(int *         const,int)" (?mergeSortP@@YAXQAHH@Z) referenced in function "void __cdecl checkIfNumberIsMoreThenThreeTimes(int * const,int)" (?checkIfNumberIsMoreThenThreeTimes@@YAXQAHH@Z)
1>C:\documents\visual studio 2012\Projects\HW - 2\Debug\HW - 2.exe : fatal error LNK1120: 1 unresolved externals

这是代码:

void checkIfNumberIsMoreThenThreeTimes(int arr[], int n)
{
    int **p;
    p = copyToPointersArr(arr, n);
    mergeSortP(*p, n);
    output( arr, p, n);
}

//

int** copyToPointersArr(int *arr, int n)
{
    int **pointers;

    for (int i=0; i<n; i++)
        *pointers[i]=arr[i];
    return pointers;
}

//

void merge(int **a1, int **a2, int size1, int size2, int **res)
{
    int ind1, ind2, ind;
    ind1=ind2=ind=0;
    while (ind1<size1 && ind2<size2)
    {
        if (*a1[ind1]<=*a2[ind2])
        {
            res[ind]=a1[ind1];
            ind1++;
        }
        else
        {
            res[ind]=a2[ind2];
            ind2++;
        }
        ind++;
    }
    while (ind1<size1)
    {
        res[ind]=a1[ind1];
        ind1++;
        ind++;
    }
    while (ind2<size2)
    {
        res[ind]=a2[ind2];
        ind2++;
        ind++;
    }
} 

//

void mergeSortP(int **a, int size)
{
    int i;
    int **temp=NULL;
    if (size==1)
        return;
    else
    {
        mergeSortP(a, size/2);
        mergeSortP(a+(size/2), size-(size/2));
        temp = new int* [size];
        merge(a, a+(size/2), size/2 , size-(size/2), temp);
        for (i = 0; i < size; i++)
            a[i] = temp[i];
        delete []temp;
        temp=NULL;
    }
 }

//

void output(int arr[], int **ptr,int size)
{

    int i, j, count=0;
    for (i = 0; i < size-1; i++)
    {
        if(*ptr[i]==*ptr[i+1]) 
            count++;
        else if (count>=2) 
        {
            cout << *ptr[i] << ": ";
            for (j = count; j >= 0; j--)
                cout << (ptr[i-j]-arr) << ", ";
            count=0;
        }
        else
            count=0;
    }
}

请帮忙!!! 提前谢谢....

2 个答案:

答案 0 :(得分:0)

void checkIfNumberIsMoreThenThreeTimes(int arr[], int n)中,您有

int **p;

mergeSortP(*p, n);

因此mergeSortP的第一个参数是int*类型。

但是,你只有一个功能

void mergeSortP(int **a, int size)

所以链接器抱怨因为找不到它。也许你打算打电话

mergeSortP(p, n);

代替?

答案 1 :(得分:0)

以下可能有所帮助:https://ideone.com/oiAzTh

void displayFrequentNumber(const std::vector<int>& input)
{
    std::vector<std::pair<int, std::size_t>> v;

    for (std::size_t i = 0; i != input.size(); ++i) {
        v.push_back({input[i], i});
    }
    std::sort(begin(v), end(v));
    for (auto it = begin(v); it != end(v); ) {
        auto next = find_if(it, end(v),
                            [it](const std::pair<int, std::size_t>& rhs)
                                {return it->first != rhs.first;});
        if (next - it >= 3) {
            std::cout << it->first << ":";
            for (; it != next; ++it) {
                std::cout << " " << it->second;
            }
            std::cout << std::endl;
        }
        it = next;
    }
}