【发布时间】:2017-04-07 03:52:37
【问题描述】:
很抱歉,如果这是在其他地方发布的(我找不到任何东西,因为我的问题相当具体),但我理解(或至少在理论上)错误是什么;我在如何解决它时遇到了麻烦。该代码应该显示合并排序的工作原理;代码运行,但它从来没有命中函数调用“合并”(下面的代码,我知道在导入中调用 all 是不好的做法,但它不是一个主要项目,所以我不在乎;也许是只是预览,但写的是 import java.util.; 和 import java.security.;)。
import java.util.*;
import java.security.*;
public class Merge {
public static void mergeSort(int[] data) {
sortArray(data, 0, data.length - 1);
}
private static void sortArray(int[] data, int low, int high) {
if ((high - low) >= 1) {
int m1 = low + high;
int m2 = m1 + 1;
System.out.printf("Split: %s\n", subarrayString(data, low, high));
System.out.printf(" %s\n", subarrayString(data, low, m1));
System.out.printf(" %s\n\n", subarrayString(data, m2, high));
sortArray(data, low, m1);
sortArray(data, m2, high);
merge(data, low, m1, m2, high);
}
}
public static void merge(int[] data, int l, int m1, int m2, int r) {
int lIndex = l, rIndex = r, cIndex = l, combined[] = new int[data.length];
System.out.printf("Merge: %s\n", subarrayString(data, l, m1));
System.out.printf(" %s\n", subarrayString(data, m1, r));
while (lIndex <= data[rIndex]) {
if (data[lIndex] <= data[rIndex])
combined[cIndex++] = data[lIndex++];
else
combined[cIndex++] = data[rIndex++];
}
if (lIndex == m2)
while (rIndex <= r) combined[cIndex++] = data[rIndex++];
else
while (lIndex <= m1) combined[cIndex++] = data[rIndex++];
}
private static String subarrayString(int[] data, int low, int high) {
StringBuilder temp = new StringBuilder();
for (int i = 0; i < low; i++)
temp.append(" ");
for (int i = 0; i < high; i++)
temp.append(" " + data[i]);
return temp.toString();
}
public static void main2() {
SecureRandom gen = new SecureRandom();
int[] data = new int[10];
for (int i = 0; i < data.length; i++) data[i] = 10 + gen.nextInt(50);
System.out.printf("\nUnsorted Array:\n%s\n\n", Arrays.toString(data));
mergeSort(data);
System.out.printf("\nSorted Array:\n%s\n\n", Arrays.toString(data));
}
}
如果您需要驱动程序文件,请告诉我。重申一下,问题是它永远不会到达合并函数调用并导致堆栈溢出错误。
【问题讨论】:
标签: java java-8 stack-overflow function-call