[英]Java QuickSort Stack Overflow with 20,000 or more integers
在具有20,000或更多整數的數組上運行quicksort時,出現以下錯誤。
project1.Project1.quickSort(Project1.java:31)上的“主”線程java.lang.StackOverflowError中的異常
我正在用p = 0和r = array.length-1調用quickSort
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;
}
您可能會考慮將程序修改為迭代的。 這樣做的基本思想是自己使用堆棧來處理當前由遞歸處理的作業。
閱讀本文以獲取更多參考。
天真的實現QuickSort的問題之一是在最壞的情況下遞歸深度為O(n)
。 如果所有分區或幾乎所有分區僅將O(1)
元素分配給結果分區之一,則將發生這種情況。 將觸發的條件取決於樞軸的選擇和數據。 在您的特定情況下,如果數組元素都具有相同的值,或者它們按排序或反向排序順序,則將發生這種情況。 這種情況可能解釋了堆棧溢出。
樞軸的選擇對於QuickSort而言非常重要,該QuickSort可以對各種輸入有效地執行操作。 我建議三位數或隨機選擇作為相當不錯的相對容易的選擇。 這些方法都將解決[反向]排序的情況,但是還需要進行其他更改才能解決恆定值的情況。
此外,您可以肯定地將遞歸深度限制為O(log n)
是僅遞歸地對每個分區的較小部分進行排序,然后循環對較大部分進行排序。 這是很難從遞歸調用一個單獨的功能分區進行實施,但它會解決的恆定值情況還算不錯。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.