public static void quickSort(int[] array, int low, int high) {
//Если массив состоит из одного эл-та(low=high)
//Или, если введены неверные индексы(low>high),
//То функция не сработает!
if (low >= high) {
return;
}
//Ставим маркеры(L и R)
int L = low;
int R = high;
//index среднего эл-та в массиве
int separator = L - (L - R) / 2;
//маркеры не должны пересекаться
while (L < R) {
while ((array[L] <= array[separator]) && L < separator) {
L++;
}
while ((array[separator] <= array[R]) && R > separator) {
R--;
}
if (L < R) {
swap(array, L, R);
//Если маркер L добрался до опорного эл-та раньше, чем маркер R, то
if (L == separator) {
separator = R;
//Если маркер R добрался до опорного эл-та раньше, чем маркер L, то
} else if (R == separator) {
separator = L;
}
}
}
//Cортируем левую часть от опорного эл-та и правую
//(таким же сценарием, что и выше)
//И в итоге получаем, ОТСОРИРОВАННЫЙ массив!
quickSort(array, low, separator);
quickSort(array, separator + 1, high);
}
Почему тут такая запись, а не, скажем,
(L+R)/2
, или еще проще:
R>>1
?
//index среднего эл-та в массиве
int separator = L - (L - R) / 2;