Cod sursa(job #963400)

Utilizator vendettaSalajan Razvan vendetta Data 17 iunie 2013 13:02:20
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");

vector<int> v;

class MergeSort{
    int temp[500005];
    void init(){
        for(int i=0; i<500005; ++i) temp[i] = 0;
    }

    void mergeSort(int l, int r){
        if (l == r) return;
        int mid = (l + r) >> 1;
        mergeSort(l, mid);
        mergeSort(mid+1, r);
        // acum ma ocup de nodul curent; stiind ca cei doi fii ai lui sunt in ordine crescatore
        // acum trebe sa fac interclasare de 2 vectori sortati crescator
        temp[0] = 0;
        // acum sortez portiunea [l, r];
        for(int step=1,iL=l, iR=mid+1; step<=(r-l+1); ++step){
            // acum il iau pe iL
            if ( (iL <= mid && v[iL] <= v[iR]) || iR > r ){
                temp[ ++temp[0] ] = v[iL]; ++iL;
            }else {// ma duc in iR;
                temp[ ++temp[0] ] = v[iR]; ++iR;
            }
        }
        for(int i=l, iTemp=1; i<=r; ++i, ++iTemp) v[i] = temp[iTemp];
    };

    public:
    void Sort(){
        init();
        mergeSort(0, int(v.size())-1 );
    }
};

int main(){
    int n = 0, x =0;
    f >> n; for(int i=1; i<=n; ++i) f >> x, v.push_back(x);
    MergeSort X;
    X.Sort();
    for(int i=0; i<int(v.size()); ++i) g << v[i] << " ";
}