这是我的排序尝试的代码。在Eclipse的调试器模式下运行大约十分钟后,我收到了很多StackOverFlow错误。这是我的输出显示:
线程“main”中的异常java.lang.StackOverflowError
在TestSorter.Tester.sort(Tester.java:6)
...(在TestSorter.Tester.sort(Tester.java:49)重复x112次)
在TestSorter.Tester.sort(Tester.java:49)
public static int[] sort(int[] a) {
int prod = (a.length)/2, b = lessThan(a, prod), c = greaterThan(a, prod), d = equalTo(a, prod);
int[] first, last, mid;
first = new int[b];
last = new int[c];
mid = new int[d];
int[] fina = new int[a.length];
int f = 0, l = 0, m = 0;
if (isSorted(a))
return a;
for (int x = 0; x < a.length; x++) {
if (a[x] < prod) {
first[f] = a[x];
f++;
}
else if (a[x] > prod) {
last[l] = a[x];
l++;
}
else if (a[x] == prod) {
mid[m] = a[x];
m++;
}
}
if (m == a.length)
return a;
first = sort(first);
last = sort(last);
for (int x = 0; x < b; x++) {
fina[x] += first[x];
}
for (int x = 0; x < d; x++) {
fina[x + b] = mid[x];
}
for (int x = 0; x < c; x++) {
fina[x + b + c] = last[x];
}
return fina;
}
我的支持方法如下:
private static int lessThan(int[] a, int prod) {
int less = 0;
for (int x = 0; x < a.length; x++) {
if (a[x] < prod) {
less++;
}
}
return less;
}
private static int greaterThan(int[] a, int prod) {
int greater = 0;
for (int x = 0; x < a.length; x++) {
if (a[x] > prod) {
greater++;
}
}
return greater;
}
private static int equalTo(int[] a, int prod) {
int equal = 0;
for (int x = 0; x < a.length; x++) {
if (a[x] == prod) {
equal++;
}
}
return equal;
}
private static boolean isSorted(int[] a) {
for (int x = 0; x < a.length - 1; x++) {
if (a[x] > a[x + 1])
return false;
}
return true;
}
答案 0 :(得分:1)
据推测,问题在于你的&#34; prod&#34;不在您的数组域内。因此,&#34;第一&#34;或者&#34;最后&#34;与输入数组大小相同,并且您具有无限递归。尝试将prod设置为您要排序的数组中的元素。
答案 1 :(得分:1)
三点:
pord
应该是数组的中间元素,而不是数组长度的一半。
所以,它应该是prod =a[(a.length) / 2]
,
不是prod =(a.length) / 2
如果数组第一个只有1个元素,则不需要再调用方法sort
。
还有最后
所以,添加if
声明:
if (1 < first.length) {
first = sort(first);
}
将last
元素追加到fina时,索引应为x+b+d
,表示first
元素(b
)+ {{1} } elements(mid
)。不是d
。
因此,请将x+b+c
更改为fina[x + b + c] = last[x];
嗯,方法fina[x + b + d] = last[x];
可能是这样的:
sort