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;
}
示例#2
0
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);
}
示例#3
0
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;
}