我正在尝试创建一个递归合并排序,我不确定它为什么不起作用。我已阅读其他线程并尝试调试,但最终结果未排序,一个元素将更改为其他内容。这是代码:
public static <E extends Comparable<E>> void mergeSort(E[] array){
mergeSortRec(array, 0, array.length-1);
}
private static <E extends Comparable<E>> void mergeSortRec(E[] array, int firstIndex, int lastIndex){
//base case: if length of array is 1
if (firstIndex == lastIndex)
//return on void method: terminates method
return;
//split the array
int mid = (firstIndex + lastIndex)/2;
//recursive case
mergeSortRec(array, firstIndex, mid);
mergeSortRec(array, mid+1, lastIndex);
merge(array, firstIndex, mid, mid+1, lastIndex );
}
private static <E extends Comparable<E>> E[] merge(E[] array, int leftFirst, int leftLast, int rightFirst, int rightLast){
//create temporary array whose size equals (rightLast - leftFirst + 1)
E tmp[] = (E[]) Array.newInstance(array.getClass().getComponentType(), rightLast - leftFirst + 1);
int indexLeft = leftFirst;
int indexRight = rightFirst;
int index = 0;
while(indexLeft < leftLast && indexRight < rightLast){
//left half element is smaller
if (array[indexLeft].compareTo(array[indexRight]) < 0){
tmp[index] = array[indexLeft];
indexLeft++;
}
//right half element is smaller
else{
tmp[index] = array[indexRight];
indexRight++;
}
index++;
}
//add remaining elements to list
while(indexLeft < leftLast){
tmp[index] = array[indexLeft];
indexLeft++;
index++;
}
while(indexRight < rightLast){
tmp[index] = array[indexRight];
indexRight++;
index++;
}
//copy tmp to list
System.arraycopy(tmp, 0, array, 0, tmp.length);
return array;
}
答案 0 :(得分:0)
由于起始索引和结束索引是包含的,这意味着合并函数中的while条件应使用&lt; =。此外,当您在结束时执行arraycopy时,请确保数组的起始索引是leftFirst而不是0。