我有这个现有的代码,我需要添加一个交换和比较计数器。到目前为止,我相信我有正确的计数,但我不能让输出没有显示每个交换的循环。
public void mergeSort(int[] a, int howMany) {
if (a.length >= 2) {
// split array into two halves
int[] left = Arrays.copyOfRange(a, 0, a.length/2);
int[] right = Arrays.copyOfRange(a, a.length/2, a.length);
// sort the two halves
mergeSort(left,howMany);
mergeSort(right, howMany);
// merge the sorted halves into a sorted whole
merge(a, left, right);
}
}
// Merges the left/right elements into a sorted result.
// Precondition: left/right are sorted
public static void merge(int[] result, int[] left,
int[] right) {
int i1 = 0; // index into left array
int i2 = 0; // index into right array
int compCount = 0;
int swapCount = 0;
for (int i = 0; i < result.length; i++) {
compCount++;
if (i2 >= right.length ||
(i1 < left.length && left[i1] <= right[i2])) {
result[i] = left[i1]; // take from left
i1++;
swapCount++;
} else {
result[i] = right[i2]; // take from right
i2++;
swapCount++;
}
}
//figure this loop issue out System.out.println("merge sort " + compCount + " " + swapCount);
}
2条答案
按热度按时间wfveoks01#
在包含合并和合并排序方法的类中创建一个全局变量或字段。这将允许方法递增到变量。如果在方法中声明,它将保持为局部变量,每个递归调用将生成同名但属于不同递归方法调用的不同局部变量。因此,代码应如下所示:
v1l68za42#
我认为最优雅的解决方案是使用
int
Package 类来模拟引用传递,Java中的一切都是值传递,但如果不更改Object引用所指向的引用,就可以模拟递归调用的引用传递。下面是一个例子:
输出: