#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
метод.