Как объединить и распечатать два отсортированных массива целых чисел

#java #arrays #sorting #merge #mergesort

#java #массивы #сортировка #слияние #сортировка слиянием

Вопрос:

Я пытаюсь создать метод, который принимает два отсортированных массива int и возвращает новый массив, который объединяет и объединяет два списка без использования функции сортировки. У меня возникли проблемы в моем цикле, и я не уверен, как это исправить.

В настоящее время я получаю ошибки:

 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at pack8.Assignment8Code.merge(Assignment8Code.java:20)
    at pack8.Assignment8Code.main(Assignment8Code.java:39)
  

Вот код:

 public class Assignment8Code 
{   
    public static int[] merge(int[] arr1, int[] arr2)
    {
        //Create the first two arrays with testing numbers
        arr1 = new int[5];
        arr2 = new int[3];
        //Create a new array that will fit the length of the two given arrays
        int[] sortedArray = new int[(arr1.length   arr2.length)];
        //Create starting index values to check all arrays and merge
        int index1 = 0;
        int index2 = 0;

        //Test to see if the given arrays are populated
        while(index1 < arr1.length || index2 < arr2.length)
        {
            //Check to see which array starts with the higher number
            if(arr1[index1] < arr2[index2])
            {
                sortedArray[index1] = arr1[index1];
                index1  ;
            }
            else
            {
                sortedArray[index2] = arr2[index2];
                index2  ;
            }
        }
        return sortedArray;
    }
}
  

Комментарии:

1. Почему вы сразу отбрасываете параметры? Удалите эти два new int оператора. — while(index1 < arr1.length || index2 < arr2.length) означает, что вы продолжаете, даже если один из них находится в конце. так почему же вы не ожидали if(arr1[index1] < arr2[index2]) сбоя, когда один из них находится в конце? Вы можете сравнивать только 2 значения, если на обоих входах есть значения, которые нужно сравнить.

2. Вам также необходимо сохранить отдельный индекс в выходном массиве вместо использования либо index1 или index2 .

3. @Kevin или используйте index1 index2

Ответ №1:

В вашем коде есть несколько проблем:

  • вы должны использовать отдельный метод для тестирования, присваивания arr1 и arr2 в merge методе побеждает его цель.
  • вы должны использовать отдельный индекс для целевого массива.
  • вы должны прекратить сравнивать элементы, когда дойдете до конца любого массива
  • вы должны иметь дело с оставшимися элементами отдельно.

Вот исправленная версия merge метода:

 public class Assignment8Code 
{   
    public static int[] merge(int[] arr1, int[] arr2)
    {
        // Allocate a new array that will fit the length of the two given arrays
        int[] sortedArray = new int[(arr1.length   arr2.length)];

        int index1 = 0;
        int index2 = 0;
        int index3 = 0;

        // Merge the sorted arrays
        while (index1 < arr1.length amp;amp; index2 < arr2.length)
        {
            //Check to see which array starts with the higher number
            if (arr1[index1] <= arr2[index2])
            {
                sortedArray[index3  ] = arr1[index1  ];
            }
            else
            {
                sortedArray[index3  ] = arr2[index2  ];
            }
        }
        // Append the remaining elements 
        while (index1 < arr1.length)
        {
            sortedArray[index3  ] = arr1[index1  ];
        }
        while (index2 < arr2.length)
        {
            sortedArray[index3  ] = arr2[index2  ];
        }
        return sortedArray;
    }
}
  

Обратите внимание, что этот подход довольно неэффективен, поскольку он выделяет новый массив для каждого слияния. Реализация сортировки слиянием таким образом для больших массивов привела бы к выделению значительного объема mmemory (log2 (N) * N целых чисел), вызывая ненужную нагрузку на сборщик мусора. Использование одного временного массива для всей сортировки слиянием было бы намного эффективнее, но для этого требуется другой merge метод.