Cod sursa(job #1175091)

Utilizator SpiderManSimoiu Robert SpiderMan Data 24 aprilie 2014 14:16:14
Problema Sortare prin comparare Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
# include <algorithm>
# include <cstdio>
# include <vector>
using namespace std ;

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

vector < int > V ;
int N, cnt;

template <class Iter>
inline Iter SelectPivot(Iter begin, Iter end) {
     advance(begin, distance(begin, end) / 2);
     return begin;
}

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

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

    //Iter pivot_position = left;
    while ( left <= right ) { ++cnt;
        for ( ; *left < val; ++left ) ;
        for ( ; *right > val; --right ) ;
        if ( left <= right ) {
            std :: swap ( *left, *right ) ;
            ++left, --right;
        }
    }
    /*for (; left != right; ++left) { ++cnt;
        if (*left < val) {
            std::swap(*left, *pivot_position++);
        }
    }*/

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

    //right = pivot_position;
    //++right;
    QuickSort(begin, right, less);
    QuickSort(left, end, less);
}
// 3669777
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] ) ;
    }
    fprintf(stderr, "%d\n", cnt);
}