当我在具有20,000或更多整数的数组上运行quicksort时,我收到以下错误。
线程“main”java.lang.StackOverflowError中的异常 在project1.Project1.quickSort(Project1.java:31)
我正在调用quickSort,p = 0且r = array.length-1
public static int[] createArray(int size)
{
int []array = new int[size];
for(int i=0;i<size;i++)
{
array[i]= randomGenerator.nextInt(100000);
}
return array;
}
public static void quickSort(int p, int r)
{
if(p < r)
{
int q = partition(p, r);
quickSort(p,q - 1);
quickSort(q+1,r);
}
}
public static int partition(int p,int r)
{
int x = array[r];
int i = p-1;
for(int j=p;j<=r-1;j++)
{
if(array[j]<= x)
{
i++;
swap(i,j);
}
}
swap(i+1,r);
return i+1;
}
public static void swap(int i, int j)
{
int temp = array[i];
array[i]= array[j];
array[j]= temp;
}
public static void main(String[] args)
{
//Get all the required input data
System.out.print("Size to be tested: ");
sc = new Scanner(System.in);
int input = sc.nextInt();
float selectionAvg= 0,quickAvg= 0,countAvg=0, medianAvg=0;
//Run the Quick sort algorithm
array= startArray;
int low= 0;
int high = array.length-1;
startTime= System.currentTimeMillis();
quickSort(low, high);
endTime = System.currentTimeMillis();
time= endTime - startTime;
System.out.println("Quick Sort Time: " + time + " milliseconds");
//printArray();
quickAvg+= time;
}
答案 0 :(得分:1)
您可以考虑将程序修改为迭代。这样做的基本思想是使用自己的堆栈来处理当前由递归处理的作业。
请阅读此article以获取进一步参考。
答案 1 :(得分:0)
天真实现QuickSort的一个问题是在最坏的情况下递归深度为O(n)
。如果所有或几乎所有分区仅将O(1)
个元素分配给其中一个结果分区,则会发生这种情况。触发的条件取决于枢轴和数据的选择。在您的特定情况下,如果数组元素都具有相同的值,或者它们是按顺序排序或反向排序,则会发生这种情况。这种情况可能会解释您的堆栈溢出。
对于能够有效执行最广泛输入的QuickSort,枢轴选择非常重要。我建议将三个中值或随机选择作为相当好的,相对容易的替代方案。这些中的任何一个都将解决[反向]排序的情况,但是需要进行其他更改来解决常量值的情况。
此外,您可以某些通过递归地仅对每个分区的较小部分进行排序来限制递归深度至多O(log n)
,而是循环以对较大部分进行排序。在递归调用的单独函数中执行分区很难实现,但 可以合理地解决常量值情况。