计算MergeSort Java的比较次数

时间:2013-05-05 20:56:34

标签: java mergesort

我无法计算Java中mergesort的比较次数。以下是我的代码。不确定我是否把它放在错误的地方等等。

非常感谢任何帮助,谢谢。

private static int merge(int[] intArray, int first, int n1, int n2) {
    int numComparisons = 0;
        int[] temp = new int[n1+n2];
        int copied = 0, copied1 = 0, copied2 = 0;
        while((copied1 < n1) && (copied2 < n2)){
            if (intArray[first + copied1] < intArray[first + n1 + copied2]) {
                temp[copied++] = intArray[first + copied1++];
            }
            else {
                temp[copied++] = intArray[first + n1 + copied2++];
            }

        }

        while(copied1 < n1)     {
            temp[copied++] = intArray[first + copied1++];
        }
        while(copied2 < n2)     {
            temp[copied++] = intArray[first + n1 +copied2++];
        }


        for(int i = 0; i < n1+n2; i++) {
            numComparisons++;
            intArray[first + i] = temp[i];  
        }

        return numComparisons;
    }


    public static int mergeSortComparisons(int[] intArray, int first, int last){
        int n1, n2;
        if (last > 1){

            n1 = last/2;
            n2 = last - n1;

            mergeSortComparisons(intArray, first, n1);
            mergeSortComparisons(intArray, first + n1, n2);

            merge(intArray, first, n1, n2);
        }

        return first;
    }

1 个答案:

答案 0 :(得分:1)

如果要计算比较次数,请执行比较步骤,将其重构为方法,然后检测方法。您正在将numComparisons递增到错误的位置。

private static boolean lessThan(int[] ia, int leftIndex, int rightIndex) {
    numComparisons++;
    return ia[leftIndex] < ia[rightIndex];
}

使用它代替merge顶部附近的比较线。

此外,编写JUnit测试以确保您的排序有效。最后,你需要让所有的方法都是静态的吗?