#include <iostream>
#include <vector>

using namespace std;

		template< typename T, typename C >
		void quicksort( std::vector< T >& array, int hi, int lo, C comp )
		{

			while( hi > lo) {
				int i = lo;
				int j = hi;

				do {
				  // while( array[ i ] < array[ lo ] && i < j )  i++;
				  // while( array[ --j ] > array[ lo ] );

					while( comp( array[ i ], array[ lo ] ) && ( i < j ) )  i++;
					while( !comp( array[ --j ], array[ lo ] ) );

					if( i < j )
						std::swap( array[ i ], array[ j ] );

				}while( i < j );

				std::swap( array[ lo ], array[ j ] );

				if( j - lo > hi - ( j + 1 ) ) {
				   quicksort( array, j - 1, lo, comp );
				   lo = j + 1;
				}
				else {
				   quicksort( array, hi, j + 1, comp );
				   hi = j - 1;
				}
			}
		}

int main() {
	
	vector< int > v = { 4, 7, 2 };
	
	quicksort( v, 3, 0, []( int a, int b ) -> bool { return ( a > b )? true : false; } );
	
	return 0;
}