#include <iostream>
#include <type_traits>
#include <iterator>
#include <cstdlib>
using namespace std;
// assumes T::operator <(const T&) exists for the iterated type.
template<
typename Iterator,
typename Compare=std::less<typename std::iterator_traits<Iterator>::value_type>
>
void quicksort(Iterator first, Iterator last, Compare cmp = Compare())
{
// early exit on trivial list (zero or one element)
std::size_t len = std::distance(first, last);
if (len <= 1)
return;
// establish pivot, move it to end of sequence
Iterator tail = last - 1, pvt = first + (std::rand() % (len-1));
std::iter_swap(pvt, tail);
// run through scan
pvt = first;
for (Iterator head = first; head != tail; ++head)
{
if (cmp(*head,*tail))
std::iter_swap(head, pvt++);
}
std::iter_swap(pvt, tail);
// run through sublists. note: pvt is NOT included.
quicksort(first, pvt);
quicksort(pvt+1, last);
}
//////////////////////////////////////////////////////////////////////
int main()
{
int ar[] = { 7, 3, 5, 8, 9, 2, 1, 6, 4};
std::copy(std::begin(ar), std::end(ar), std::ostream_iterator<int>(cout, " "));
std::cout << std::endl;
quicksort(std::begin(ar), std::end(ar));
std::copy(std::begin(ar), std::end(ar), std::ostream_iterator<int>(cout, " "));
std::cout << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGNzdGRsaWI+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBhc3N1bWVzIFQ6Om9wZXJhdG9yIDwoY29uc3QgVCYpIGV4aXN0cyBmb3IgdGhlIGl0ZXJhdGVkIHR5cGUuCnRlbXBsYXRlPAogICB0eXBlbmFtZSBJdGVyYXRvciwKICAgdHlwZW5hbWUgQ29tcGFyZT1zdGQ6Omxlc3M8dHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcmF0b3I+Ojp2YWx1ZV90eXBlPgo+CnZvaWQgcXVpY2tzb3J0KEl0ZXJhdG9yIGZpcnN0LCBJdGVyYXRvciBsYXN0LCBDb21wYXJlIGNtcCA9IENvbXBhcmUoKSkKewogICAgLy8gZWFybHkgZXhpdCBvbiB0cml2aWFsIGxpc3QgKHplcm8gb3Igb25lIGVsZW1lbnQpCiAgICBzdGQ6OnNpemVfdCBsZW4gPSBzdGQ6OmRpc3RhbmNlKGZpcnN0LCBsYXN0KTsKICAgIGlmIChsZW4gPD0gMSkKICAgICAgICByZXR1cm47CiAgICAKICAgIC8vIGVzdGFibGlzaCBwaXZvdCwgbW92ZSBpdCB0byBlbmQgb2Ygc2VxdWVuY2UKICAgIEl0ZXJhdG9yIHRhaWwgPSBsYXN0IC0gMSwgcHZ0ID0gZmlyc3QgKyAoc3RkOjpyYW5kKCkgJSAobGVuLTEpKTsKICAgIHN0ZDo6aXRlcl9zd2FwKHB2dCwgdGFpbCk7CiAgICAKICAgIC8vIHJ1biB0aHJvdWdoIHNjYW4KICAgIHB2dCA9IGZpcnN0OwogICAgZm9yIChJdGVyYXRvciBoZWFkID0gZmlyc3Q7IGhlYWQgIT0gdGFpbDsgKytoZWFkKQogICAgewogICAgICAgIGlmIChjbXAoKmhlYWQsKnRhaWwpKQogICAgICAgICAgICBzdGQ6Oml0ZXJfc3dhcChoZWFkLCBwdnQrKyk7CiAgICB9CiAgICBzdGQ6Oml0ZXJfc3dhcChwdnQsIHRhaWwpOwogICAgCiAgICAvLyBydW4gdGhyb3VnaCBzdWJsaXN0cy4gbm90ZTogcHZ0IGlzIE5PVCBpbmNsdWRlZC4KICAgIHF1aWNrc29ydChmaXJzdCwgcHZ0KTsKICAgIHF1aWNrc29ydChwdnQrMSwgbGFzdCk7Cn0KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKCmludCBtYWluKCkKewogICAgaW50IGFyW10gPSB7IDcsIDMsIDUsIDgsIDksIDIsIDEsIDYsIDR9OwogICAgc3RkOjpjb3B5KHN0ZDo6YmVnaW4oYXIpLCBzdGQ6OmVuZChhciksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxpbnQ+KGNvdXQsICIgIikpOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgcXVpY2tzb3J0KHN0ZDo6YmVnaW4oYXIpLCBzdGQ6OmVuZChhcikpOwogICAgc3RkOjpjb3B5KHN0ZDo6YmVnaW4oYXIpLCBzdGQ6OmVuZChhciksIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxpbnQ+KGNvdXQsICIgIikpOwogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIHJldHVybiAwOwp9