Просто проверьте ваш алгоритм слияния. Это не может быть правильным. Просто представьте, что он вызывается для массива с 2 элементами, поэтому вы оставили левый и правый как массивы только с 1 элементом.
l и r равны 0. Поэтому внутри первого if обе проверки верны, и одному элементу назначен один элемент, а l или r увеличиваются.
Теперь первое if больше не будет запускаться, потому что l или r равны 1. Таким образом, второй элемент массива не изменился.
Так что я бы сделал следующие проверки:
public static void merge(String[] arr, String[] left, String[] right){
int l = 0;
int r = 0;
for (int i = 0; i < arr.length; i++) {
if (l < left.length && r < right.length) {
if (left[l].compareTo(right[r]) <= 0)
arr[i] = left[l++];
else
arr[i] = right[r++];;
} else if (l < left.length) {
arr[i] = left[l++];
} else {
arr[i] = right[r++];
}
}
}
Итак, проверки в основном: элементы слева и справа? Затем возьмите наименьшее значение слева и справа. Если не осталось элементов в обоих, мы проверяем, где находятся элементы, и берем элемент левой или правой стороны.