В подпрограмме деления аргумент Arrays.copyOfRange
the to является исключительным, что означает, что он не будет включать индекс to в результат. Точно так же в подпрограмме слияния вы должны использовать 2 переменные для итерации двух массивов, и я изменил <= на <в большинстве мест, потому что IMO выглядит чистым. </p>
import java.util.Arrays;
class Solution {
private static int[] mergeAndDivide(int[] array) {
if (array.length < 2) return array;
int[] arrayOne = Arrays.copyOfRange(array, 0, ((array.length - 1) / 2) + 1); // the final index is exclusive meaning it will not be included in the bisected array
int[] arrayTwo = Arrays.copyOfRange(array, ((array.length - 1) / 2 + 1), array.length);
arrayOne = mergeAndDivide(arrayOne);
arrayTwo = mergeAndDivide(arrayTwo);
return merge(arrayOne, arrayTwo);
}
private static int[] merge(int[] arrayOne, int[] arrayTwo) {
int[] arrayMerged = new int[arrayOne.length + arrayTwo.length];
int i = 0;
int j = 0;
while (i < arrayOne.length && j < arrayTwo.length) { // you need 2 variables to index first and second array;
if (arrayOne[i] > arrayTwo[j]) {
arrayMerged[i + j] = arrayTwo[j];
j++;
} else {
arrayMerged[i + j] = arrayOne[i];
i++;
}
}
while (i < arrayOne.length) {
arrayMerged[i + j] = arrayOne[i];
i++;
}
while (j < arrayTwo.length) {
arrayMerged[i + j] = arrayTwo[j];
j++;
}
return arrayMerged;
}
public static void main(String[] args) {
System.out.println(Arrays.toString(mergeAndDivide(new int[]{3, 4, 5, 6, 1})));
}
}
Result : [1, 3, 4, 5, 6]