为什么我的Quicksort实现会给堆栈溢出?

时间:2016-09-14 00:23:10

标签: java stack-overflow quicksort

我有这段代码

  public static void quicksort(int[] array){
    quicksort(array, 0, array.length - 1);
  }

  public static void quicksort(int[] array, int min_index, int max_index){
    if(array.length <= 1 || min_index >= max_index){
      return;
    }

    int pivot = array[(max_index + min_index) / 2];
    int left = min_index;
    int right = max_index;

    while(left <= right){
      while(array[left] < pivot)
        left++;
      while(array[right] > pivot)
        right--;
      if( left <= right ){
        int aux = array[left];
        array[left] = array[right];
        array[right] = aux;

        left++;
        right--;
      }
    }

    if(right > min_index)
      quicksort(array, min_index, right);
    if(left < max_index)
      quicksort(array, left, max_index);

  }

哪个工作得很好,但如果我将数据库更改为pivot = array[0];,它会中断,给我一个stackoverflow异常。我尝试了其他值,它似乎只是喜欢中间点。为什么会这样?

1 个答案:

答案 0 :(得分:0)

这是Quicksort的一个众所周知的问题。对于某些输入,例如排序(或几乎排序)的数据,以及选择不当的枢轴点,Quicksort将退化为冒泡排序。由于函数是递归的,因此很容易生成堆栈溢出条件(或者在O(n 2 )时间内执行排序)。 Quicksort的教科书示例在这方面是臭名昭着的。 Quicksort做了很好的编程练习,但是你应该总是使用编译器提供的实现。

有关Quicksort的更多信息,请参阅Wikipedia文章。