#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgkJdGVtcGxhdGU8IHR5cGVuYW1lIFQsIHR5cGVuYW1lIEMgPgoJCXZvaWQgcXVpY2tzb3J0KCBzdGQ6OnZlY3RvcjwgVCA+JiBhcnJheSwgaW50IGhpLCBpbnQgbG8sIEMgY29tcCApCgkJewoKCQkJd2hpbGUoIGhpID4gbG8pIHsKCQkJCWludCBpID0gbG87CgkJCQlpbnQgaiA9IGhpOwoKCQkJCWRvIHsKCQkJCSAgLy8gd2hpbGUoIGFycmF5WyBpIF0gPCBhcnJheVsgbG8gXSAmJiBpIDwgaiApICBpKys7CgkJCQkgIC8vIHdoaWxlKCBhcnJheVsgLS1qIF0gPiBhcnJheVsgbG8gXSApOwoKCQkJCQl3aGlsZSggY29tcCggYXJyYXlbIGkgXSwgYXJyYXlbIGxvIF0gKSAmJiAoIGkgPCBqICkgKSAgaSsrOwoJCQkJCXdoaWxlKCAhY29tcCggYXJyYXlbIC0taiBdLCBhcnJheVsgbG8gXSApICk7CgoJCQkJCWlmKCBpIDwgaiApCgkJCQkJCXN0ZDo6c3dhcCggYXJyYXlbIGkgXSwgYXJyYXlbIGogXSApOwoKCQkJCX13aGlsZSggaSA8IGogKTsKCgkJCQlzdGQ6OnN3YXAoIGFycmF5WyBsbyBdLCBhcnJheVsgaiBdICk7CgoJCQkJaWYoIGogLSBsbyA+IGhpIC0gKCBqICsgMSApICkgewoJCQkJICAgcXVpY2tzb3J0KCBhcnJheSwgaiAtIDEsIGxvLCBjb21wICk7CgkJCQkgICBsbyA9IGogKyAxOwoJCQkJfQoJCQkJZWxzZSB7CgkJCQkgICBxdWlja3NvcnQoIGFycmF5LCBoaSwgaiArIDEsIGNvbXAgKTsKCQkJCSAgIGhpID0gaiAtIDE7CgkJCQl9CgkJCX0KCQl9CgppbnQgbWFpbigpIHsKCQoJdmVjdG9yPCBpbnQgPiB2ID0geyA0LCA3LCAyIH07CgkKCXF1aWNrc29ydCggdiwgMywgMCwgW10oIGludCBhLCBpbnQgYiApIC0+IGJvb2wgeyByZXR1cm4gKCBhID4gYiApPyB0cnVlIDogZmFsc2U7IH0gKTsKCQoJcmV0dXJuIDA7Cn0=