Java 只想打印一次数组-合并排序
遇到MergeSort问题。在对数组排序之后,我希望它只打印完全排序的数组,而不是每次传递。我的代码如下。在数组似乎已排序之后,我正在运行printArray(intArray)。也许我把它放错地方了?您可以在末尾的mergesortComparisons函数中看到它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];
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
。作为一个解决方案并不比包装好。所以基本上我会说它是否已经解决了?我应该把这个放在哪里?