class MergeSort {
public static void mergeSort(int[] array, int low, int high) {
if (high - low < 2) {// (0 - кол-во эл-ов массива) в итоге остается кол-во эл-ов в массиве и выполняется проверка, если 1 эл-нт или 0, то функция завершается
return;
}
int mid = (low + high) >>> 1;//low - нижняя граница куска массива, который будем сортировать, high - верхняя граница, mid - индекс середины
mergeSort(array, low, mid);// сортируем кусок между low и mid
mergeSort(array, mid, high);// сортируем кусок между mid и high
int[] b = Arrays.copyOfRange(array, low, mid);//копируем левую (нижнюю) половину массива в переменную b
// смотри, у нас два источника, которые будем сливать - b и правый кусок (между mid и high)
// а приёмником будет весь кусок от low до high
for (int i = low, j = mid, k = 0; k < b.length; i++) {
// i = low - стартовая позиция приёмника, j = mid - стартовая позиция в куске от mid до high
// k = 0 - стартовая позиция в b
if (j == high || b[k] <= array[j]) {//j == high - кончились числа в правом подмассиве или b[k] <= array[j] текущее число из b <= текущее число из правой половины
array[i] = b[k++]; // пихаем число из b
} else {
array[i] = array[j++];// пихаем число из правой половины
}
}
}
}
Скажи, дружок - ты хоть один алгоритм сортировки реализовал самостоятельно? Да ладно, известно что нет.
Мне не интересно написать что-то лишь бы кое как работало, я хочу понимать почему именно так правильно.