Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 只想打印一次数组-合并排序_Java_Mergesort - Fatal编程技术网

Java 只想打印一次数组-合并排序

Java 只想打印一次数组-合并排序,java,mergesort,Java,Mergesort,遇到MergeSort问题。在对数组排序之后,我希望它只打印完全排序的数组,而不是每次传递。我的代码如下。在数组似乎已排序之后,我正在运行printArray(intArray)。也许我把它放错地方了?您可以在末尾的mergesortComparisons函数中看到它 private static int merge(int[] intArray, int first, int n1, int n2) { int[] temp = new int[n1+n2];

遇到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;
    }
private static int merge(int[]intArray,int first,int n1,int n2){
int[]温度=新的int[n1+n2];
int copied=0,copied1=0,copied2=0;
而((复制11){
n1=最后一个/2;
n2=最后一个-n1;
合并比较(intArray,first,n1);
合并比较(intArray、first+n1、n2);
合并(阵列,第一,n1,n2);
}
打印阵列(intArray);
返回数值比较;
}

不要在
合并或比较中打印它。制作一个包装器函数并在那里打印

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

在外部,如果要打印数组,只需传入
true
值即可。这样,您就不需要复制此函数,而无需打印阵列即可执行相同的操作。它使打印数组成为一个选项。

因为您递归地调用mergesortcomparsions,所以每次合并后每次通过时都会调用printary。如果您从mergeSortComparisons方法返回intArray到最初调用它的代码,您应该能够从那里调用printArray,并且它只执行一次。

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


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

printary(intArray)
的调用次数与您进行递归调用的次数相同。不要用递归方法打印,我很困惑。你能进一步澄清吗?我正在从另一个类调用mergeSortComparisons。如果我不需要包装器怎么办?你可以向函数添加bool参数来确定是否应该打印。在外部,您将传入
true
。在函数体内部,当递归调用mergesortcomparison时,将传入
false
。作为一个解决方案并不比包装好。所以基本上我会说它是否已经解决了?我应该把这个放在哪里?