blob: 090f329147dee10bfe7814efb4f8e0caebe2ecfd [file] [log] [blame]
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
unsigned long findInversions(vector<long>& input);
int main()
{
std::vector<long> inputData(0);
ifstream infile("IntegerArray.txt");
string buf;
long value;
stringstream str_str;
while (!infile.eof())
{
buf.clear();
infile >> buf;
if (buf.length() == 0)
continue;
str_str << buf;
str_str >> value;
str_str.clear();
inputData.push_back(value);
}
unsigned long inversions = findInversions(inputData);
cout << "Number of inversions: " << inversions << endl;
getchar();
return 0;
}
unsigned long findInversions(vector<long>& input)
{
int size = input.size();
if (size <= 1)
return 0L;
unsigned long inversions = 0;
vector<long> subset1(size/2);
vector<long> subset2(size - size/2);
copy(input.begin(), input.begin() + subset1.size(), subset1.begin());
copy(input.begin() + subset1.size(), input.end(), subset2.begin());
inversions += findInversions(subset1);
inversions += findInversions(subset2);
int size1 = subset1.size();
int size2 = subset2.size();
int i = 0, j = 0, c = 0;
while (i < size1 && j < size2)
{
if (subset1[i] < subset2[j])
{
input[c++] = subset1[i++];
continue;
}
else
{
input[c++] = subset2[j++];
inversions += size1 - i;
}
}
while (i < size1 && c < size)
input[c++] = subset1[i++];
while (j < size2 && c < size)
input[c++] = subset2[j++];
return inversions;
}