合并排序在Java中运行得太慢

合并排序在Java中运行得太慢,java,performance,merge,mergesort,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

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

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都是以与数组相同的大小创建的,但我无法找到任何其他方法来实现这一点,包括使用rightTop-leftBottom+1作为长度,这将返回一个错误。有人有什么想法吗?

我怀疑您返回的错误是IndexOutOfBoundsException,因为您从flag开始索引middleMan等于leftBottom,这可能远远超出元素大小:假设您正在将元素从100合并到103,元素为4,flag=leftBottom=100


若要解决此问题,请在所有递归合并调用之外只分配一次与当前大小相同的中间人,并将此临时数组作为此方法的额外参数传递。

这有点难读。要我编辑它吗?很抱歉,我不知道该怎么做才好