#include <iostream>
#include <type_traits>
#include <iterator>
#include <algorithm>
#include <ctime>
#include <cstdlib>
// 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)
typename std::iterator_traits<Iterator>::difference_type len = std::distance(first, last);
if (len <= 1)
return;
// establish pivot, move it to end of sequence
Iterator tail = std::prev(last,1);
Iterator pvt = std::next(first, std::rand() % len);
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, last);
}
//////////////////////////////////////////////////////////////////////
int main()
{
std::srand((unsigned)(std::time(NULL)));
int a[] = {1, 9, 2, 8, 3, 7, 4, 6, 5 };
quicksort(std::begin(a), std::end(a));
std::copy(std::begin(a), std::end(a),
std::ostream_iterator<int>(std::cout,"\n"));
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CiNpbmNsdWRlIDxpdGVyYXRvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCi8vIGFzc3VtZXMgVDo6b3BlcmF0b3IgPChjb25zdCBUJikgZXhpc3RzIGZvciB0aGUgaXRlcmF0ZWQgdHlwZS4KdGVtcGxhdGU8CiAgIHR5cGVuYW1lIEl0ZXJhdG9yLAogICB0eXBlbmFtZSBDb21wYXJlPXN0ZDo6bGVzczx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvcj46OnZhbHVlX3R5cGU+Cj4Kdm9pZCBxdWlja3NvcnQoSXRlcmF0b3IgZmlyc3QsIEl0ZXJhdG9yIGxhc3QsIENvbXBhcmUgY21wID0gQ29tcGFyZSgpKQp7CiAgICAvLyBlYXJseSBleGl0IG9uIHRyaXZpYWwgbGlzdCAoemVybyBvciBvbmUgZWxlbWVudCkKICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJhdG9yPjo6ZGlmZmVyZW5jZV90eXBlIGxlbiA9IHN0ZDo6ZGlzdGFuY2UoZmlyc3QsIGxhc3QpOwogICAgaWYgKGxlbiA8PSAxKQogICAgICAgIHJldHVybjsKICAgIAogICAgLy8gZXN0YWJsaXNoIHBpdm90LCBtb3ZlIGl0IHRvIGVuZCBvZiBzZXF1ZW5jZQogICAgSXRlcmF0b3IgdGFpbCA9IHN0ZDo6cHJldihsYXN0LDEpOwogICAgSXRlcmF0b3IgcHZ0ID0gc3RkOjpuZXh0KGZpcnN0LCBzdGQ6OnJhbmQoKSAlIGxlbik7CiAgICBzdGQ6Oml0ZXJfc3dhcChwdnQsIHRhaWwpOwogICAgCiAgICAvLyBydW4gdGhyb3VnaCBzY2FuCiAgICBwdnQgPSBmaXJzdDsKICAgIGZvciAoSXRlcmF0b3IgaGVhZCA9IGZpcnN0OyBoZWFkICE9IHRhaWw7ICsraGVhZCkKICAgIHsKICAgICAgICBpZiAoY21wKCpoZWFkLCp0YWlsKSkKICAgICAgICAgICAgc3RkOjppdGVyX3N3YXAoaGVhZCwgcHZ0KyspOwogICAgfQogICAgc3RkOjppdGVyX3N3YXAocHZ0LCB0YWlsKTsKICAgIAogICAgLy8gcnVuIHRocm91Z2ggc3VibGlzdHMuIG5vdGU6IHB2dCBpcyBOT1QgaW5jbHVkZWQuCiAgICBxdWlja3NvcnQoZmlyc3QsIHB2dCk7CiAgICBxdWlja3NvcnQoKytwdnQsIGxhc3QpOwp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCmludCBtYWluKCkgCnsKICAgIHN0ZDo6c3JhbmQoKHVuc2lnbmVkKShzdGQ6OnRpbWUoTlVMTCkpKTsKCQogICAgaW50IGFbXSA9IHsxLCA5LCAyLCA4LCAzLCA3LCA0LCA2LCA1IH07CiAgICBxdWlja3NvcnQoc3RkOjpiZWdpbihhKSwgc3RkOjplbmQoYSkpOwoJCiAgICBzdGQ6OmNvcHkoc3RkOjpiZWdpbihhKSwgc3RkOjplbmQoYSksCiAgICAgICAgc3RkOjpvc3RyZWFtX2l0ZXJhdG9yPGludD4oc3RkOjpjb3V0LCJcbiIpKTsKCSAgICAKCXJldHVybiAwOwp9