因此,当以不同的方式选择枢轴时,我选择除了传入的arraylist中的最后一个元素之外的任何东西都会遇到堆栈溢出错误。在“3的中位数”类型的选择是它发生最多的地方。
public static <T> void quickSort (ArrayList<T> incomingArray, Comparator<? super T> cmp, int start, int end)
{
if(start >= end)
return;
T pivot = incomingArray.get(start + ((end - start)/2)); <--Stack overflow
if(cmp.compare(incomingArray.get(start + ((end - start)/2)), incomingArray.get(0)) < 0)
{
swap(incomingArray, (start + ((end - start)/2)), 0);
}
if(cmp.compare(incomingArray.get(end), incomingArray.get(start + ((end - start)/2))) < 0)
{
swap(incomingArray, end, (start + ((end - start)/2)));
}
if(cmp.compare(incomingArray.get((start + ((end - start)/2))), incomingArray.get(end)) < 0)
{
swap(incomingArray, 0, end);
}
swap(incomingArray, (start + ((end - start)/2)), end);
pivot = incomingArray.get(end);
int leftBound = 0;
int rightBound = end - 1;
while(leftBound < rightBound)
{
while(cmp.compare(incomingArray.get(leftBound), pivot) <= 0 && leftBound < rightBound)
leftBound++;
while(cmp.compare(incomingArray.get(rightBound), pivot) >= 0 && leftBound < rightBound)
rightBound--;
swap(incomingArray, leftBound, rightBound);
}
swap(incomingArray, rightBound, end);
quickSort(incomingArray, cmp, start, leftBound);
quickSort(incomingArray, cmp, rightBound + 1, end);
}
交换调用只会更改传递数组中索引位置的值。
答案 0 :(得分:0)
首先似乎没有问题:
if(cmp.compare(incomingArray.get((start + ((end - start)/2))), incomingArray.get(end)) < 0)
{
swap(incomingArray, 0, end);
}
比较中间和最后一个元素但是将第一个和最后一个元素交换为
答案 1 :(得分:0)
堆栈溢出可能是由于快速排序实现中的错误造成的。如果我正确理解你的代码,我会在其中发现一些奇怪的行。
假设quicksort(start, end)
将子数组从索引start
排序到索引end
,以下几行没有多大意义:
if (cmp.compare(incomingArray.get(start + ((end - start) / 2)), incomingArray.get(0)) < 0) {
swap(incomingArray, (start + ((end - start) / 2)), 0);
}
此处索引0开始发挥作用,大部分时间都在start
到end
之外。与行相同
swap(incomingArray, 0, end);
和
int leftBound = 0;
修复算法问题,然后重试。
答案 2 :(得分:0)
我只是复制粘贴你的代码并运行100,000个数字,我没有遇到任何堆栈溢出问题。您确定您的交换和比较功能是否按预期正常工作?