Cod sursa(job #2486915)

Utilizator cyber_ghSoltan Gheorghe cyber_gh Data 3 noiembrie 2019 17:44:30
Problema Sortare prin comparare Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <bits/stdc++.h>


using namespace std;

int rs = 0;
const int MAXN = 500010;
int n;
int arr[MAXN];

int merge(int left, int mid, int right, int arr[]) {
    queue<int> q1,q2;
    for (int i = left; i <= mid; i++) q1.push(arr[i]);
    for (int i = mid + 1; i <= right; i++) q2.push(arr[i]);

    int index = left;
    int inv = 0;
    int i = left;
    while (!q1.empty() && !q2.empty()) {
        if (q1.front() <= q2.front()) {
            arr[index] = q1.front();
            q1.pop();
            
        } else {
            arr[index] = q2.front();
            q2.pop();
            inv += q1.size();
        }
        index++;
    } 

    while (!q1.empty()) {
        arr[index] = q1.front();
        q1.pop();
        index++;
    }

    while (!q2.empty()) {
        arr[index] = q2.front();
        q2.pop();
        index++;
    }
    return inv;
}

int mergesort(int left, int right, int arr[]) {
    if (left >= right) return 0;

    int mid = (left + right) / 2;
    
    int inv = mergesort(left, mid, arr);
    inv += mergesort(mid + 1, right, arr);

    inv += merge(left, mid, right, arr);

    return inv;
}

int main() {

    ifstream fin("algsort.in");
    ofstream fout("algsort.out");
    
    fin >> n;
    for (int i = 0; i < n; i++) fin >> arr[i];

    mergesort(0, n - 1, arr);

    for (int i = 0; i < n; i++) fout << arr[i] <<" ";
    return 0;
}