递归合并排序Java

时间:2014-10-25 07:05:23

标签: sorting recursion mergesort

我正在尝试创建一个递归合并排序,我不确定它为什么不起作用。我已阅读其他线程并尝试调试,但最终结果未排序,一个元素将更改为其他内容。这是代码:

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;
}

1 个答案:

答案 0 :(得分:0)

由于起始索引和结束索引是包含的,这意味着合并函数中的while条件应使用&lt; =。此外,当您在结束时执行arraycopy时,请确保数组的起始索引是leftFirst而不是0。

相关问题