template<class T>
void quickSort(T a[],int l,int r)
{
int i, j, k, p, q;
T v;
if (r <= l) return;
v = a[r]; i = l - 1; j = r; j = l - 1; q = r;
for (;;)
{
while (less(a[++i], v));
while (less(v, a[--j]))
if (j == l) break;
if (i >= j) break;
swap(a[i], a[j]);
if (eq(a[i], v)){ p++, swap(a[p], a[i]);}
if (eq(v, a[j])){ q++, swap(a[q], a[j]);}
}
swap(a[i], a[r]); j = i - 1; i = i + 1;
for (k = l; k < p; k++, j--) swap(a[k], a[j]);
for (k = r - 1; k>q; k--, i++) swap(a[k], a[i]);
quickSort(a, l, j);
quickSort(a, i, r);
}