gpt4 book ai didi

java - 合并排序算法中的堆栈溢出错误?

转载 作者:行者123 更新时间:2023-12-01 14:29:29 27 4
gpt4 key购买 nike

我正在用 java 编写一个合并排序类,当我到达 sort(left) 行时,出现堆栈溢出错误。有什么想法吗?我不明白为什么这会成为一个问题。

包ds;

import java.util.Comparator;

public class MergeSorter<T> extends Sorter<T> {

public MergeSorter(Comparator<T> comparator){
super(comparator);
}

@SuppressWarnings("unchecked")
@Override
public void sort(T[] array){
if (array.length <= 1);
else {
T[] left = (T[]) new Object[array.length/2 + 1];
T[] right = (T[]) new Object[array.length/2 + 1];
int middleIndex = array.length / 2;
for (int i = 0; i < middleIndex; i++) {
left[i] = array[i];
}
for (int i = middleIndex; i < array.length; i++) {
right[i - middleIndex] = array[i];
}
sort(left);
sort (right);
merge(left, right, array);
}
}

public final void merge(T[] left, T[] right, T[] array){
Array<T> sortedArray = new Array<T>(array.length);
while (left.length > 0 || right.length > 0) {
if (left.length > 0 && right.length > 0) {
if (comparator.compare(left[0], right[0]) < 0) {
sortedArray.add(left[0]);
for (int i = 1; i < left.length; i++) {
left[i - 1] = left[i];
left[left.length - 1] = null;
}
}
else {
sortedArray.add(right[0]);
for (int i = 1; i < right.length; i++) {
right[i - 1] = right[i];
right[right.length - 1] = null;
}
}
}
else if (left.length > 0) {
sortedArray.add(left[0]);
for (int i = 1; i < left.length; i++) {
left[i - 1] = left[i];
left[left.length - 1] = null;
}
}
else if (right.length > 0) {
sortedArray.add(right[0]);
for (int i = 1; i < right.length; i++) {
right[i - 1] = right[i];
right[right.length - 1] = null;
}
}
}
for (int i = 0; i < array.length; i++) {
array[i] = sortedArray.get(i);
}
}

}

最佳答案

假设数组的长度为2。然后左边是:

T[] left = (T[]) new Object[array.length/2 + 1];

这是

T[] left = (T[]) new Object[2/2 + 1];

这等于

T[] left = (T[]) new Object[2];

当您向左排序时,这种情况会继续,并导致无限递归,这可能导致您发布的堆栈溢出错误。

由于您要将第一个 middleIndex 元素复制到 left 中,因此 middleIndex 长度应正好适合数组 left 。所以 left 应该是一个长度 array.length/2 数组。

关于java - 合并排序算法中的堆栈溢出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16948231/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com