void Utilities::QuickSort(std::vector<int>::iterator begin, std::vector<int>::iterator end, std::vector<int>& v)
{
// Initially find a random pivot
if (begin >= end - 1)
return;
int pivotIndex = std::rand() % (end - begin);
int pivot = v.at(pivotIndex);
// Pointer to begining of array and one to the end
// While begin != end
while(begin != end)
{
// Find the lowest bound number to swap
while(*begin < pivot && begin < end)
begin++;
while(*end >= pivot && begin < end)
end--;
// Do the swap
Utilities::Swap(begin, end);
}
// Here begin and end are equal and equal to point from where left side is lower and right side is greater or equal to pivot
// Partition left
Utilities::QuickSort(v.begin(), begin, v);
// Partition right
Utilities::QuickSort(begin, --v.end(), v);
}
dm9pZCBVdGlsaXRpZXM6OlF1aWNrU29ydChzdGQ6OnZlY3RvcjxpbnQ+OjppdGVyYXRvciBiZWdpbiwgc3RkOjp2ZWN0b3I8aW50Pjo6aXRlcmF0b3IgZW5kLCBzdGQ6OnZlY3RvcjxpbnQ+JiB2KQp7CiAgLy8gSW5pdGlhbGx5IGZpbmQgYSByYW5kb20gcGl2b3QKICBpZiAoYmVnaW4gPj0gZW5kIC0gMSkKICAgIHJldHVybjsKICBpbnQgcGl2b3RJbmRleCA9IHN0ZDo6cmFuZCgpICUgKGVuZCAtIGJlZ2luKTsKICBpbnQgcGl2b3QgPSB2LmF0KHBpdm90SW5kZXgpOwogIAogIC8vIFBvaW50ZXIgdG8gYmVnaW5pbmcgb2YgYXJyYXkgYW5kIG9uZSB0byB0aGUgZW5kCiAgCiAgLy8gV2hpbGUgYmVnaW4gIT0gZW5kIAogIHdoaWxlKGJlZ2luICE9IGVuZCkKICB7CiAgICAvLyBGaW5kIHRoZSBsb3dlc3QgYm91bmQgbnVtYmVyIHRvIHN3YXAKICAgIHdoaWxlKCpiZWdpbiA8IHBpdm90ICYmIGJlZ2luIDwgZW5kKQogICAgICBiZWdpbisrOwogICAgd2hpbGUoKmVuZCA+PSBwaXZvdCAmJiBiZWdpbiA8IGVuZCkKICAgICAgZW5kLS07CiAgICAKICAgIC8vIERvIHRoZSBzd2FwCiAgICBVdGlsaXRpZXM6OlN3YXAoYmVnaW4sIGVuZCk7CiAgfQogIAogIC8vIEhlcmUgYmVnaW4gYW5kIGVuZCBhcmUgZXF1YWwgYW5kIGVxdWFsIHRvIHBvaW50IGZyb20gd2hlcmUgbGVmdCBzaWRlIGlzIGxvd2VyIGFuZCByaWdodCBzaWRlIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gcGl2b3QKICAKICAvLyBQYXJ0aXRpb24gbGVmdAogIFV0aWxpdGllczo6UXVpY2tTb3J0KHYuYmVnaW4oKSwgYmVnaW4sIHYpOwogIC8vIFBhcnRpdGlvbiByaWdodAogIFV0aWxpdGllczo6UXVpY2tTb3J0KGJlZ2luLCAtLXYuZW5kKCksIHYpOwp9