【发布时间】:2014-10-25 15:21:11
【问题描述】:
我正在尝试创建递归合并排序,但我不确定它为什么不起作用。我已阅读其他线程并尝试调试,但最终结果未排序,一个元素会变成其他元素。代码如下:
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;
}
【问题讨论】:
标签: sorting recursion mergesort