簡體   English   中英

Java QuickSort堆棧溢出,包含20,000個或更多整數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM