Cod sursa(job #796973)

Utilizator claudiumihailClaudiu Mihail claudiumihail Data 13 octombrie 2012 04:44:09
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.52 kb
#include <fstream>
#include <iostream>
#include <algorithm>
#include <vector>
#include <iterator>
#include <functional>

using namespace std;

typedef unsigned int uint32;

template<typename T>
class QSortParitionPredicate
{
public:
    QSortParitionPredicate(const T& v) :
        val(v)
    {}
    
    bool operator () (const T& elem) const
    {
        return elem < val;
    }

private:
    T val;
};

template <class Iter>
void quicksort(Iter start, Iter end)
{
    if (std::distance(start, end) > 0)
    {
        Iter pivot = start + std::distance(start, end)/2;
        //QSortParitionPredicate<uint32> predQS(*pivot);

        Iter partIndex = partition(start, end, bind2nd(less<typename iterator_traits<Iter>::value_type>(), *start));

        quicksort(start, partIndex);
        quicksort(max(start + 1, partIndex), end);
    }
}

int main()
{
    int n;
    vector<uint32> vec;
    fstream fin("algsort.in", fstream::in);
    fstream fout("algsort.out", fstream::out);
    
    fin >> n;
    //cout << n << endl;
    
    vec.reserve(n);
    
    istream_iterator<uint32> inIt(fin);
    istream_iterator<uint32> eofIt;
    
    copy(inIt, eofIt, back_inserter(vec));
    
    /*for (int i=0; i<n; ++i)
    {
        //fin >> vec[i];
        cout << vec[i] << " ";
    }
    cout << endl;*/
    
    quicksort(vec.begin(), vec.end());
    
    ostream_iterator<uint32> outIt(fout, " ");
    copy(vec.begin(), vec.end(), outIt);
    
    //cout << endl;

    return 0;
}