Cod sursa(job #1175413)

Utilizator SpiderManSimoiu Robert SpiderMan Data 24 aprilie 2014 20:01:15
Problema Sortare prin comparare Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
# include <algorithm>
# include <cstdio>
# include <vector>
using namespace std ;

const char *FIN = "algsort.in", *FOU = "algsort.out" ;

vector < int > V ;
int N ;

template <class Iter>
Iter SelectPivot(Iter begin) {
    return ++begin;
}

template <class Iter, class Cmp>
void QuickSort(Iter begin, Iter end, Cmp less) {
    //if (distance(begin, end) < 2) return;
    Iter left = begin;
    Iter right = end;
    --right;
    if (left >= right) return;
    Iter pivot = SelectPivot(begin);
    auto val = *pivot;

    std::swap(*pivot, *right);

    Iter pivot_position = left;

    for (; left != right; ++left) {
        if (less(*left, val)) {
            std::swap(*left, *pivot_position++);
        }
    }

    std::swap(*pivot_position, *right);

    right = pivot_position;

    QuickSort(begin, pivot_position, less);
    QuickSort(++right, end, less);
}

template <class It, class Cmp>
inline void Sort(It First, It Last, Cmp FCmp) {
    QuickSort(First, Last, FCmp);
}

int main ( void ) {
    freopen ( FIN, "r", stdin ) ;

    scanf ( "%d", &N ) ;
    for ( int i = 0, x; i < N; ++i ) {
        scanf ( "%d", &x ) ;
        V.push_back ( x ) ;
    }

    Sort(V.begin(), V.end(), [](const int a, const int b) {
        return a < b;
    });

    freopen ( FOU, "w", stdout ) ;
    for ( int i = 0; i < N; ++i ) {
        printf ( "%d ", V[i] ) ;
    }
}