#java #algorithm #sorting #merge #array-merge
#java #алгоритм #сортировка #слияние #массив-слияние
Вопрос:
Это решение отлично подходит для меня, но у меня есть вопрос. Когда я отлаживал свою программу, я заметил, что, например, для этого ввода (когда я тестирую правильную работу программы) -> int[] arr = {1,3}; int[] arr1 = {2,4}; Я вижу, что мой индекс первого массива по какой-то причине увеличивается, и мой отладчик показывает, что на том же этапе массив находится вне диапазона. Программа работает и с этим, но я хотел бы знать, как теоретически это можно исправить или это не имеет смысла, и все работает правильно? Я также пробовал различные проверки If (), но ничего не устранило проблему. Надеюсь, я донес до вас суть проблемы.
public static int[] mergeArr(int[] arr1, int[] arr2) {
int[] result = new int[arr1.length arr2.length];
int i = 0;
int j = 0;
int k = 0;
while (i < arr1.length amp;amp; j < arr2.length) {
if (arr1[i] < arr2[j]) {
result[k ] = arr1[i];
i ;
} else {
result[k ] = arr2[j];
j ;
}
System.arraycopy(arr1, i, result, k, arr1.length - i);
System.arraycopy(arr2, j, result, k, arr2.length - j);
}
return resu<
}
}
Комментарии:
1. Ваша программа проигнорирует первый маленький элемент, например, с двумя массивами, которые вы привели выше, 1 не будет в результирующем массиве.
2. Почему ты звонишь
System.arraycopy()
? Попробуйте удалить эти 2 строки. Также измените свой цикл наfor (int k = 0; k < result.length; k )
3. @Bohemian это только усугубило мою ситуацию, и теперь я действительно получаю сообщение об ошибке, мне кажется, что решение этой проблемы с помощью цикла for — не очень хорошая идея.
4. @Bohemian Если мы говорим о System.arraycopy, я использую его для записи так называемого оставшегося «хвоста» в памяти. Без этого метода я не смогу правильно получить желаемый результат, а поскольку при сравнении последних индексов я не буду использовать копирование массива, я просто получу 0 в последней позиции массива.