【发布时间】:2018-02-05 06:28:00
【问题描述】:
我正在尝试实现合并排序功能,但在尝试运行它时收到 StackOverflowError 异常。我看到了另一个与我类似的问题,答案是关于更改中点的计算方式。我试图更改中点,但仍然遇到相同的 stackoverflow 错误。
感谢收看。
public static void mergeSort(int [] arr, int low, int high) {
if (low < high) {
int mid = (low + high)/2;
mergeSort(arr, low, mid + 1);
mergeSort(arr, mid, high);
merge(arr, low, mid, high);
}
}
public static void merge(int [] arr, int low, int mid, int high) {
int n1 = mid - low + 1;
int n2 = high - mid;
int [] leftArr = new int[n1];
int [] rightArr = new int[n2];
for (int i = 0; i < n1; i++) leftArr[i] = arr[low + i];
for (int j = 0; j < n2; j++) rightArr[j] = arr[mid + j + 1];
int i = 0;
int j = 0;
int k = 1;
while (i < n1 && j < n2) {
if (leftArr[i] < rightArr[j]) {
arr[k] = leftArr[i++];
}
else {
arr[k] = rightArr[j++];
}
k++;
}
while (i < n1) arr[k++] = leftArr[i++];
while (j < n2) arr[k++] = rightArr[j++];
}
【问题讨论】:
-
您的
merge方法包含low和high,所以您的意思可能是mergeSort(arr, low, mid - 1);,而不是+ 1。如果你调用mergeSort(x, 0, 2),它将计算mid = 1,所以你调用mergeSort(x, 0, 2)和mergeSort(x, 1, 2),当你应该调用mergeSort(x, 0, 0)和mergeSort(x, 1, 2)时,因为第一次调用是无限递归.稍微调试会告诉你的事情!!!!
标签: java stack-overflow mergesort