在Java中,Merge Sort的运行速度太慢了

时间:2014-10-23 21:55:00

标签: java performance merge mergesort

我正在编写一个合并排序来与各种其他类型的排序进行比较,并且出于某种原因,它的运行速度比预期慢得多。这是代码的相关部分:

private static <E extends Comparable<E>> void merge (E[] array, int leftBottom, int leftTop, int rightBottom, int rightTop){
    @SuppressWarnings("unchecked")
    E[] middleMan = (E[]) Array.newInstance(array.getClass().getComponentType(), array.length+1);

    int leftFlag = leftBottom;
    int rightFlag = rightBottom;
    int flag = leftBottom;
    int elements = (rightTop - leftBottom + 1);

    while ((leftFlag <= leftTop) && (rightFlag <= rightTop)){
        if (array[leftFlag].compareTo(array[rightFlag])<=0){
            middleMan[flag++] = array[leftFlag++];
        }
        else{
            middleMan[flag++] = array[rightFlag++];
        }
    }

    while (leftFlag <= leftTop){
        middleMan[flag++] = array[leftFlag++];
    }

    while (rightFlag <= rightTop){
        middleMan[flag++] = array[rightFlag++];
    }

    for (int i = 0; i < elements; i++){
        array[rightTop] = middleMan[rightTop];
        rightTop--;
    }
}

我怀疑原因是因为“middleMan”的创建大小与“array”相同,无论我递归多少,但我无法想出任何其他方法(包括使用rightTop - leftBottom) + 1作为长度,返回错误)。有人有任何想法吗?

1 个答案:

答案 0 :(得分:0)

我怀疑您的“返回错误”为IndexOutOfBoundsException,因为您最初从middleMan索引flag等于leftBottom,这可能远远超出elements } size:假设您要合并100到103之间的元素,elements为4,flag = leftBottom = 100。

要解决此问题,请在所有递归middleMan调用之外分配merge(当前大小相同),并将此临时数组作为此方法的额外arg传递。