Я пытаюсь реализовать mergesort в Java. Я понимаю алгоритм, но у меня проблемы с реализацией. Вот код, который я написал:Функция слияния алгоритма сортировки слияния не так
package sort;
import java.util.Arrays;
public class MergeSort {
public MergeSort() {
}
public static void main(String[] args) {
int[] d = {26,14,72,34,622,483};
MergeSort ms = new MergeSort();
int[] results = ms.mergesort(d);
for (int i = 0; i < results.length; i++) {
System.out.println(results[i]);
}
}
public int[] mergesort(int[] a) {
System.out.println("Another call to merge sort");
if (a.length <= 1) { return a;}
int mid = a.length/2;
int[] left = Arrays.copyOfRange(a,0,mid);
int[] right = Arrays.copyOfRange(a,mid + 1,a.length);
left = mergesort(left);
right = mergesort(right);
int[] result = merge(left,right);
return result;
}
private int[] merge(int[] b, int[] c) {
System.out.println("Another call to merge");
int[] result = new int[b.length+c.length];
if (b.length == 0) {
return c;
} else if (c.length == 0) {
return b;
} else if (b[0] < c[0] && b.length == 1) {
result[0] = b[0];
for (int i = 1; i < result.length; i++) {
result[i] = c[i -1];
}
return result;
}else if (b[0] > c[0] && c.length == 1) {
result[0] = c[0];
for (int i = 0; i < result.length; i++) {
result[i] = b[i-1];
}
return result;
}
else if (b[0] < c[0]) {
result[0] = b[0];
result = merge(result,merge(Arrays.copyOfRange(b,1,b.length),c));
return result;
} else if (b[0] > c[0]) {
result[0] = c[0];
result = merge(result,merge(b,Arrays.copyOfRange(c,1,c.length)));
return result;
} else {
System.out.println("Fell to the bottom.");
return result;
}
}
}
Проблема заключается в моей функции слияния. Я попытался выполнить алгоритм здесь: http://discrete.gr/complexity/, но я продолжал получать IndexOutOfBoundsExceptions
, потому что если массив был только размером 1, для захвата нет индекса 1 для Arrays.copyOfRange
. Я попытался исправить это в своем коде, но это становится очень грязным. Теперь, как сейчас, это вызовет множество вызовов в функции, а затем выбросит IndexOutOfBoundsException
. Я бы очень признателен за помощь в этом. И я просто делаю это самостоятельно, чтобы попытаться понять это, а не как домашнее задание.
Я думаю, что это должно быть 'int [] right = Arrays.copyOfRange (a, mid + 1, a.length-1);' потому что последний элемент массива на основе 0 равен length-1. – martinstoeckli
@martinstoeckli для param of copyOfRange является эксклюзивным. –
@AdrianLeonhard - я вижу, я не знаком с Java, поэтому я думал, что это будет похоже на C#. – martinstoeckli