Cod sursa(job #1175416)

Utilizator SpiderManSimoiu Robert SpiderMan Data 24 aprilie 2014 20:02:35
Problema Sortare prin comparare Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 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>
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(left, right);
	auto val = *pivot;

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

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

	QuickSort(begin, ++right, less);
	QuickSort(left, 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] ) ;
    }
}