只想打印一次数组 - MergeSort

时间:2013-05-05 22:20:22

标签: java mergesort

遇到MergeSort的问题。在对数组进行排序后,我希望它只打印完全排序的数组,而不是每次传递。我的代码如下。我似乎在对数组进行排序后运行printArray(intArray)。也许我把它放在错误的位置?您可以在最后的mergesortComparisons函数中看到它。

private static int merge(int[] intArray, int first, int n1, int n2) {

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

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

        printArray(intArray);
        return numComparisons;
    }

3 个答案:

答案 0 :(得分:1)

请勿在{{1​​}}内打印。制作包装函数并将其打印出来。

mergeSortComparisons

有时候包装很有用。

修改

如果你不想要一个包装器,这是另一个简单的解决方案:

public static int mergeSort(int[] intArray, int first, int last) {
    int comparisons = mergeSortComparisons(intArray, first, last);
    printArray(intArray);
    return comparisons;
}

在外部,如果要打印数组,只需传入值public static int mergeSortComparisons(int[] intArray, int first, int last, boolean wantToPrint){ int n1, n2; if (last > 1){ n1 = last/2; n2 = last - n1; mergeSortComparisons(intArray, first, n1, false); mergeSortComparisons(intArray, first + n1, n2, false); merge(intArray, first, n1, n2); } if (wantToPrint) { printArray(intArray); } return numComparisons; } 。这样,在不打印数组的情况下,您无需复制此函数即可执行相同操作。它使打印数组成为一种选择。

答案 1 :(得分:1)

由于您以递归方式调用mergeSortComparisons,因此每次合并后每次传递都会调用printArray。如果你将mergeSortComparisons方法中的intArray返回到最初调用它的代码,你应该能够从那里调用printArray,它只会执行一次。

答案 2 :(得分:0)

由于您在printArray内拨打mergeSortComparisons,因此mergeSortComparisons的每次调用都会有一行与之关联的输出。由于mergeSortComparisons是递归的,这意味着每个递归步骤都会得到一行输出。

最简单的解决方案是从printArray中删除mergeSortComparisons并将其移至最初从mergeSortComparisons调用的任何位置。