template<class T>
void swap(T* x, int i, int j) {
T tmp;
tmp = x[i]; x[i] = x[j]; x[j] = tmp;
}
int randint(int l, int u) {
srand(time(NULL));
return l + rand() % (u-l + 1);
}
const int cutoff = 5;
template<class T>
void QSort4(T* x, int l, int u) {
if (u - l < cutoff)
return;
swap(x, l, randint(l, u));
T t;
int i,j;
t = x[l]; i = l; j = u+1;
while (1) {
/* пропуск элементов справа и слева,
чтобы не делать лишней работы */
do i++; while (i <= u && x[i] < t);
do j--; while (x[j] > t);
if (i > j)
break;
// Делаем swap(i, j):
T tmp;
tmp = x[i]; x[i] = x[j]; x[j] = tmp;
}
swap(x, l, j);
QSort4(x, l, j-1);
QSort4(x, j+1, u);
}