【问题标题】:Merge Sort is running far too slow in Java合并排序在 Java 中运行太慢
【发布时间】:2014-12-19 17:08:16
【问题描述】:

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

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 作为长度,返回错误)。有人有什么想法吗?

【问题讨论】:

  • 这有点难读。
  • 您要我编辑它吗?很抱歉,不知道如何让它变得更好

标签: java performance merge mergesort


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2015-12-16
    • 2015-04-20
    • 2011-09-01
    • 2021-06-06
    • 2010-10-04
    相关资源
    最近更新 更多