#include <bits/stdc++.h>
using namespace std;
// using Lomuto partition scheme
int Partition(int a[], int start, int end)
{
// Pick rightmost element as pivot from the array
int pivot = a[end];
// elements less than pivot will be pushed to the left of pIndex
// elements more than pivot will be pushed to the right of pIndex
// equal elements can go either way
int pIndex = start;
// each time we finds an element less than or equal to pivot, pIndex
// is incremented and that element would be placed before the pivot.
for (int i = start; i < end; i++)
{
if (a[i] <= pivot)
{
swap(a[i], a[pIndex]);
pIndex++;
}
}
// swap pIndex with Pivot
swap (a[pIndex], a[end]);
// return pIndex (index of pivot element)
return pIndex;
}
/* We select the smaller sub-array, recurse on that portion,
the continually shrink the array from the recursing side
through the iterative control until the array is sorted.
As such, we successfully sort the array in a way that
maximizes while control, while minimizing recursive depth. */
void tailRecursiveQuicksort(int A[], int start, int end)
{
while (start < end)
{
int pivot = Partition(A, start, end);
// recurse on smaller sub-array
if (pivot - start < end - pivot)
{
tailRecursiveQuicksort(A, start, pivot - 1);
start = pivot + 1;
}
else
{
tailRecursiveQuicksort(A, pivot + 1, end);
end = pivot - 1;
}
}
}
int main()
{
int a[] = { 9, -3, 5, 2, 6, 8, -6, 1, 3 };
int n = sizeof(a)/sizeof(a[0]);
// tail Recursive Quicksort routine
tailRecursiveQuicksort(a, 0, n - 1);
// print the sorted array
for (int i = 0 ; i < n; i++)
cout << a[i] << " ";
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyB1c2luZyBMb211dG8gcGFydGl0aW9uIHNjaGVtZQppbnQgUGFydGl0aW9uKGludCBhW10sIGludCBzdGFydCwgaW50IGVuZCkKewoJLy8gUGljayByaWdodG1vc3QgZWxlbWVudCBhcyBwaXZvdCBmcm9tIHRoZSBhcnJheQoJaW50IHBpdm90ID0gYVtlbmRdOwoKCS8vIGVsZW1lbnRzIGxlc3MgdGhhbiBwaXZvdCB3aWxsIGJlIHB1c2hlZCB0byB0aGUgbGVmdCBvZiBwSW5kZXgKCS8vIGVsZW1lbnRzIG1vcmUgdGhhbiBwaXZvdCB3aWxsIGJlIHB1c2hlZCB0byB0aGUgcmlnaHQgb2YgcEluZGV4CgkvLyBlcXVhbCBlbGVtZW50cyBjYW4gZ28gZWl0aGVyIHdheQoJaW50IHBJbmRleCA9IHN0YXJ0OwkKCQoJLy8gZWFjaCB0aW1lIHdlIGZpbmRzIGFuIGVsZW1lbnQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBpdm90LCBwSW5kZXgKCS8vIGlzIGluY3JlbWVudGVkIGFuZCB0aGF0IGVsZW1lbnQgd291bGQgYmUgcGxhY2VkIGJlZm9yZSB0aGUgcGl2b3QuIAoJZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspCgl7CgkJaWYgKGFbaV0gPD0gcGl2b3QpCgkJewoJCQlzd2FwKGFbaV0sIGFbcEluZGV4XSk7CgkJCXBJbmRleCsrOwoJCX0KCX0KCS8vIHN3YXAgcEluZGV4IHdpdGggUGl2b3QKCXN3YXAgKGFbcEluZGV4XSwgYVtlbmRdKTsKCQoJLy8gcmV0dXJuIHBJbmRleCAoaW5kZXggb2YgcGl2b3QgZWxlbWVudCkKCXJldHVybiBwSW5kZXg7Cn0KCi8qIFdlIHNlbGVjdCB0aGUgc21hbGxlciBzdWItYXJyYXksIHJlY3Vyc2Ugb24gdGhhdCBwb3J0aW9uLAp0aGUgY29udGludWFsbHkgc2hyaW5rIHRoZSBhcnJheSBmcm9tIHRoZSByZWN1cnNpbmcgc2lkZSAKdGhyb3VnaCB0aGUgaXRlcmF0aXZlIGNvbnRyb2wgdW50aWwgdGhlIGFycmF5IGlzIHNvcnRlZC4gCkFzIHN1Y2gsIHdlIHN1Y2Nlc3NmdWxseSBzb3J0IHRoZSBhcnJheSBpbiBhIHdheSB0aGF0IAptYXhpbWl6ZXMgd2hpbGUgY29udHJvbCwgd2hpbGUgbWluaW1pemluZyByZWN1cnNpdmUgZGVwdGguICovCnZvaWQgdGFpbFJlY3Vyc2l2ZVF1aWNrc29ydChpbnQgQVtdLCBpbnQgc3RhcnQsIGludCBlbmQpCnsKCXdoaWxlIChzdGFydCA8IGVuZCkgCgl7CgkJaW50IHBpdm90ID0gUGFydGl0aW9uKEEsIHN0YXJ0LCBlbmQpOwoJCQoJCS8vIHJlY3Vyc2Ugb24gc21hbGxlciBzdWItYXJyYXkKCQlpZiAocGl2b3QgLSBzdGFydCA8IGVuZCAtIHBpdm90KSAKCQl7CgkJCXRhaWxSZWN1cnNpdmVRdWlja3NvcnQoQSwgc3RhcnQsIHBpdm90IC0gMSk7CgkJCXN0YXJ0ID0gcGl2b3QgKyAxOwoJCX0gCgkJZWxzZSAKCQl7CgkJCXRhaWxSZWN1cnNpdmVRdWlja3NvcnQoQSwgcGl2b3QgKyAxLCBlbmQpOwoJCQllbmQgPSBwaXZvdCAtIDE7CgkJfQoJfQp9CgppbnQgbWFpbigpCnsKCWludCBhW10gPSB7IDksIC0zLCA1LCAyLCA2LCA4LCAtNiwgMSwgMyB9OwoJaW50IG4gPSBzaXplb2YoYSkvc2l6ZW9mKGFbMF0pOwoJCgkvLyB0YWlsIFJlY3Vyc2l2ZSBRdWlja3NvcnQgcm91dGluZQoJdGFpbFJlY3Vyc2l2ZVF1aWNrc29ydChhLCAwLCBuIC0gMSk7CgoJLy8gcHJpbnQgdGhlIHNvcnRlZCBhcnJheQoJZm9yIChpbnQgaSA9IDAgOyBpIDwgbjsgaSsrKQoJCWNvdXQgPDwgYVtpXSA8PCAiICI7Cn0=