Quicksort实现中的Stackoverflower错误

时间:2018-05-10 22:24:45

标签: java recursion stack-overflow quicksort

import java.util.Random;

public class Quicksort {

    private int partition(int arr[], int first, int last) {

    int pivot = arr[last]; //Using last element as pivot
    int i = (first-1);//index of smaller element

    for (int j = first; j < last; j++) {
        //if current element is smaller than or equal to pivot
        //then swap the elements
        if (arr[j] <= pivot) {
            i++;
            //swapping occurs here
            //make a temp variable to the first element
            //swap arr[j] and arr[i]
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            //i++;
        }
    }
    int temp = arr[i+1];
    arr[i+1] = arr[last];
    arr[last] = temp;
    return i+1;
}

private void quickSort(int arr[], int first, int last) {

    if (first < last) {
        int pivindex = partition(arr, first, last);
        quickSort(arr, first, pivindex-1);
        quickSort(arr, pivindex+1, last);
    }
}

public void sort(int[] arr) {
    quickSort(arr, 0, arr.length - 1);
}

public static int[] getRandoms(int count) {
    return new Random().ints().limit(count).toArray();
}

public static void main(String[] args) {
    Quicksort fix = new Quicksort();

    int[] randoms = getRandoms(40000);
    double startTime = System.currentTimeMillis();
    fix.sort(randoms);    
    double endTime = System.currentTimeMillis();
    System.out.println("Performance Time on Random Data:" + (endTime - startTime));

    //Benchmarking quicksort on already sorted data
    startTime = System.currentTimeMillis();
    fix.sort(randoms);
    endTime = System.currentTimeMillis();
    System.out.println("Performance Time on Sorted Data:" + (endTime - startTime));

}
}

我不完全确定为什么我会收到Stackoverflower。当我只排序一次时,代码运行正常,但是,如果我尝试将相同的数据排序两次,那就是当我得到错误时。

我理解Stackoverflower是因为使用递归存在问题。在这种情况下,我的错误来自

线程“main”java.lang.StackOverflowError中的异常     在quicksort.Quicksort.quickSort(Quicksort.java:36)

是......

if (first < last) {
        int pivindex = partition(arr, first, last);
        quickSort(arr, first, pivindex-1);
        quickSort(arr, pivindex+1, last);
    }

1 个答案:

答案 0 :(得分:1)

  

@ mackycheese21当我说它运行正常时,我的意思是如果我使用一个较小的阵列,我可以打印出来看看,它将打印出来排序。排序40,000个随机整数也一样,直到我尝试对已排序的数组进行排序。

所以我想你只想检查数组是否已排序。 因为这看起来效率不高,所以我能想到的另一件事就是你的'f'方法,对于排序数组,给出第一个或最后一个索引 - 分区时给出一个空数组和满阵列。这可能导致无限递归。

我建议您只需在partition中添加一个检查,以检查索引是转到第一个还是最后一个,然后如果确实发生这种情况,只需在中间拆分。