簡體   English   中英

快速排序遞歸-StackOverFlow

[英]Quicksort Recursion - StackOverFlow

我正在實現一個遞歸的快速排序,但是我正在接收stackoverflow,不確定該錯誤在哪里:(

我正在從10-50排序100萬個整數。

我的作品尺寸不超過100萬,例如10萬等。

public Quicksort(int NUM_TESTS, int NUM_ELEMENTS){
    num_tests = NUM_TESTS;
    num_elements = NUM_ELEMENTS;
}

private void start(){
    for (int i = 0; i < num_tests; i++){
        int[] d1 = dataGeneration(num_elements);
        qSortRecursive(d1,0,d1.length-1);
    }
}

public static void main(String args[]){
    Quicksort q = new Quicksort(1,1000000);
    q.start();    
}

private int[] dataGeneration(int n) {
    int[] d1 = new int[n];
    for (int i = 0; i < n; i++){
        d1[i] = (int)(Math.random() * ((50 - 10) + 1) + 10);
    }
    return d1;
}

private void qSortRecursive(int[] data, int left, int right){
    if(left < right){
        int pivot = partition(data,left,right);
        qSortRecursive(data,left,pivot-1);
        qSortRecursive(data,pivot+1,right);
    }
}

private int partition(int[] data, int left, int right){
    int pivot = left ;
    left++;
    while (left <= right){
        while (left <= right && data[left] <= data[pivot]) {
            left++;
        }

        while (left <= right && data[right] >= data[pivot]){
            right--;
        }

        if (left < right){
            swap(data,left,right);
            left++;
            right--;
        }          
    }

    if (data[right] <= data[pivot]){
        if (data[right] != data[pivot]){
            swap(data,right,pivot);
        }
        pivot = right;
    } 

    return pivot;
}

private void swap(int[] data, int i, int j){
    int temp = data[i];
    data[i] = data[j];
    data[j] = temp;
}
    private void qSortRecursive(int[] data, int left, int right){
    while (left < right){
        int pivot = partition(data,left,right);
        if (pivot - left < right - pivot){
            qSortRecursive(data, left, pivot - 1);
            left = pivot + 1;
        } else {
            qSortRecursive(data, pivot + 1, right);
            right = pivot - 1;
        }
    }

通過減少遞歸次數執行尾部調用解決了我的問題,謝謝大家的幫助:)

您可以嘗試不遞歸地重寫算法。 好了,您可以通過添加自己的堆棧來消除遞歸,在這種情況下,您可以擁有整個內存,而不僅僅是堆棧的大小。

類似於: http//alienryderflex.com/quicksort/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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