long long int sort_and_count(std::vector<int> &v, int s, int e, std::vector<int> &c) { if (s >= e - 1) { //if only one element return 0; } int mid = (s + e) / 2; long long int x = sort_and_count(v, s, mid, c); long long int y = sort_and_count(v, mid, e, c); long long int z = merge_and_count(v, s, mid, e, c); return x + y + z; }
void sort_and_count(SortedList *sl, int_l from_idx, int_l to_idx) { int_l length = to_idx - from_idx; // end case if (length == 1) { return; } int_l left_size = length / 2; int_l right_size = length - left_size; int_l med = from_idx + left_size; sort_and_count(sl, from_idx, med); sort_and_count(sl, med, to_idx); merge_and_count(sl, from_idx, med, to_idx); }
long_l count_inversions(int_l input_size, int_l *input_array) { int_l *buffer_array = malloc(sizeof(int_l) * input_size); memcpy(buffer_array, input_array, sizeof(int_l) * input_size); SortedList sl; sl.source_array = input_array; sl.buffer_array = buffer_array; sl.inversions = 0; int m; sort_and_count(&sl, 0, input_size); return sl.inversions; }
int main(int argc, char **argv) { out("Starting...\n"); int m; std::vector<int> v; while(scanf("%d", &m) != EOF) { v.push_back(m); } printf("size=%d\n", v.size()); std::vector<int> c; c.resize(v.size()); //printf("inversions=%d\n", count_inversions(v)); printf("inversions2=%lld\n", sort_and_count(v, 0, v.size(), c)); return 0; }