计数反转[合并排序]

时间:2017-12-15 22:11:54

标签: c++ algorithm

在尝试计算来自非常大的数据集的反转时,我从以下过程得到了错误的答案。

我还尝试了一些在相关帖子上给出/建议的其他代码,并且在我的代码本身中尝试了很多操作[以获得正确答案]但被拒绝了。如果我不知道正确答案,我只能验证我是否有答案。

另外,为了更多地帮助自己,我用O(n^2)方式试了一下,以便至少得到答案,但我得到的答案被拒绝了。

代码生成错误输出:-1887062008

#include <iostream>
#include <vector>
#include <fstream>

using namespace std;


int mergeAndCount(vector<int> & arr, int first, int second, int last) {

    vector<int> temp; 
    int i = first, j = second;
    int invCount = 0;

    while( i < second && j <= last ) {

        if( arr[i] > arr[j] ) {

            invCount += second - i; 
            temp.push_back( arr[j] );
            j++;
        }
        else {
            temp.push_back( arr[i] );
            i++;
        }
    }

    while( i < second ) {
        temp.push_back( arr[i++] );
    }

    while ( j <= last ) {
        temp.push_back( arr[j++] );
    }

    copy( temp.begin(), temp.end(), arr.begin()+first);

    return invCount;
}


int sortAndCount( vector<int>& arr, int low, int high ) {

    if( low >= high )
        return 0;

    int mid = low + (high-low)/2;
    int lic = sortAndCount( arr, low, mid );
    int ric = sortAndCount( arr, mid+1, high);
    int ic = mergeAndCount( arr, low, mid+1, high);

    return lic+ric+ic;
}


int getInversionCount(vector<int>& arr ) {
    if( arr.size() > 0 )
        return sortAndCount( arr, 0, arr.size()-1 );

    return 0;
}

void Test1() {

    vector<int> arr;

    ifstream inFile;

    inFile.open("w2.txt");

    if (!inFile) {
        cout << "Unable to open file datafile.txt"; 
    }

    int value;

    while(inFile >> value) {
        arr.push_back(value);
    }

    cout << getInversionCount( arr) << endl;
}


int main() {
    Test1();
    return 0;
}

1 个答案:

答案 0 :(得分:0)

我只是一个学生,我必须制作相同的算法,所以不要太相信我;但我认为在 sortAndCount 中,您必须为元素数量设置条件。喜欢:

int sortAndCount( vector<int>& arr, int low, int high ) {

     if( air.size()==1){
         return 0;
    }
    else if( arr.size() >=2){
      int mid = low + (high-low)/2;
      int lic = sortAndCount( arr, low, mid );
      int ric = sortAndCount( arr, mid+1, high);
      int ic = mergeAndCount( arr, low, mid+1, high);
    }
     return lic+ric+ic;
 }