我有一个文本文件,包含100,000个数字,从1到100,000,未按照未排序的方式进行(没有重复)。
该文件的名称为"IntegerArray.txt"
我的任务是计算文本文件中的反转次数。反转是一对元素a
,b
,其中a
位于b
之前,但是a > b
。因此" 1 2 3 6 4 5"包含两个反转(6> 4和6> 5)。
我用合并排序方法实现了它;排序工作,但计数倒置部分一直给出错误的答案,我找不到原因。
以下是我的代码:
long long mergeAndCount(vector<int>& vec, int p, int q, int r) {
long long count = 0;
vector<int> L, R;
for (int i = p; i <= q; ++i) L.push_back(vec[i]);
for (int j = q + 1; j <= r; ++j) R.push_back(vec[j]);
L.push_back(numeric_limits<int>::max()); //sentinel element
R.push_back(numeric_limits<int>::max());
int i = 0, j = 0;
for (int k = p; k <= r; ++k) {
if (L[i] <= R[j]) {
vec[k] = L[i];
++i;
} else {
vec[k] = R[j];
++j;
if (L[i] != L.back() && R[j] != R.back())
// Problem SOLVED: change this line to count += q - p + 1 - i
count += q - i + 1;
}
}
return count;
}
long long inversion(vector<int>& vec, int p, int r) {
long long count = 0;
if (p < r) {
int q = (p + r) / 2;
count = inversion(vec, p, q);
count += inversion(vec, q + 1, r);
count += mergeAndCount(vec, p, q, r);
}
return count;
}
int main() {
ifstream infile("IntegerArray.txt");
int a;
vector<int> vec;
while (infile >> a)
vec.push_back(a);
cout << inversion(vec, 0, vec.size()-1);
return 0;
}
上述代码的结果是32620796130,这是不正确的。
使用以下代码通过暴力破解答案是2407905288,这是正确的。
long long inversion(vector<int>& vec, int p, int r) {
long long count = 0;
for (int i = 0; i < vec.size(); ++i)
for (int j = i + 1; j < vec.size(); ++j)
if (vec[i] > vec[j])
++count;
return count;
}
有人可以帮我解决这个问题吗?