Cod sursa(job #1127143)

Utilizator avram_florinavram florin constantin avram_florin Data 27 februarie 2014 11:21:09
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

const char inputFile[] = "algsort.in";
const char outputFile[] = "algsort.out";

void merge( std::vector<int>& values, int lower, int midd, int upper)
{
    std::vector<int> leftValues (values.begin()+lower, values.begin()+midd+1);
    std::vector<int> rightValues (values.begin()+midd+1, values.begin()+upper+1);

    unsigned int i,j,k;
    for( i=0, j=0, k=lower ; i < leftValues.size() || j < rightValues.size() ; ) {
        if( j >= rightValues.size() || ( i < leftValues.size() && 
                    leftValues[i] < rightValues[j] ) )
            values[k++] = leftValues[i++];
        else
            values[k++] = rightValues[j++];
    }
}

void merge_sort( std::vector<int>& values, int lower, int upper )
{
    if( lower == upper )
        return;

    int midd = ((upper - lower) >> 1) + lower;
    merge_sort(values, lower, midd);
    merge_sort(values, midd+1, upper);
    merge(values, lower, midd, upper);
}

std::istream& operator>> (std::istream& input, std::vector<int>& vector)
{
    unsigned int n;
    input >> n;
    for( unsigned int i = 0 ; i < n ; i++ ) {
        int x;
        input >> x;
        vector.push_back(x);
    }
    return input;
}

std::ostream& operator<< (std::ostream& output, std::vector<int>& vector)
{
    for( std::vector<int>::iterator it=vector.begin() ; it < vector.end() ; it++ )
        output << *it << ' ';
    return output;
}

int main(void)
{
    std::ifstream in(inputFile);
    std::ofstream out(outputFile);

    std::vector<int> values;

    in >> values;
    merge_sort(values, 0, values.size()-1);
    out << values << '\n';

    return 0;
}