Объединение 2-х отсортированных массивов в 1

 
 
 
Сообщения:8
Всем привет! Ребята, помогите, пожалуйста, разобраться в задаче: Реализуйте метод, сливающий два отсортированных по неубыванию массива чисел в один отсортированный в том же порядке массив. Массивы могут быть любой длины, в том числе нулевой.

Предполагается, что вы реализуете алгоритм слияния, имеющий линейную сложность: он будет идти по двум исходным массивам и сразу формировать отсортированный результирующий массив. Так, чтобы сортировка полученного массива при помощи Arrays.sort() уже не требовалась.

Пример ввода: {0, 2, 2} и {1, 3}
Пример вывода: {0, 1, 2, 2, 3}. Написала код, но у меня он не работает в случае если в обоих массивах числа отрицательные. Что я делаю не так? Наведите, пожалуйста, на мысль. Заранее спасибо.

public static void main(String[] args) {
// System.out.println(Arrays.toString(mergeArrays(new int[]{0, 2, 2}, new int[]{1, 3})));
// System.out.println(Arrays.toString(mergeArrays(new int[]{}, new int[]{})));
System.out.println(Arrays.toString(mergeArrays(new int[]{-4, -3, -1}, new int[]{-10, -5, -2})));
//System.out.println(Arrays.toString(mergeArrays(new int[]{}, new int[]{1, 3})));
}

public static int[] mergeArrays(int[] a1, int[] a2) {
int[] a3 = new int[a1.length + a2.length];

int i = 0, j = 0;
for (int k = 0; k < a3.length; k++) {
if ((i > a1.length - 1) || (a1[i] > a2[j])) {
a3[k] = a2[j];
j++;
} else if ((j > a2.length - 1) || (a1[i] < a2[j])) {
a3[k] = a1[i];
i++;
} else {
a3[k] = a2[j];
j++;
}
}
return a3;
}
}
 
 
Сообщения:1719
Я бы предложил другой код
 public static int[] mergeArrays(int[] a1, int[] a2) {
        int[] a3 = new int[a1.length + a2.length];

        int i = 0, j = 0;
        while (i < a1.length && j < a2.length){// попеременно берем из 1 или 2 массива, пока есть элементы в обоих массивах
            if (a1[i] < a2[j]) {
                a3[i + j] = a1[i];
                i++;
            } else {
                a3[i + j] = a2[j];
                j++;
            }
        }
// если что-то осталось до дозаполняем
        for (int k = i; k < a1.length; k++) {
            a3[j + k] = a1[k];
        }
        for (int k = j; k < a2.length; k++) {
            a3[i + k] = a2[k];
        }
        return a3;
    }
 
 
Сообщения:8
Добрый вечер, спасибо большое за помощь!
 
Модераторы:alon4iknazicaTaky_
Сейчас эту тему просматривают:Нет