我正在尝试实现合并排序功能,并在尝试运行时收到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++];
}
答案 0 :(得分:1)
您实现了mergesort函数wrong.it应该是这样的
if (low < high) {
int mid = (low + high)/2;
mergeSort(arr, low, mid -1);
mergeSort(arr, mid, high);
merge(arr, low, mid, high);
}
在合并功能中,您已初始化
k=1;
但它应该是
k=low;
因为如果你每次都会初始化k = 1,那么它将覆盖数组元素。