繁体   English   中英

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

[英]Why does my Quicksort implementation give stack overflow?

我有这个代码

  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];更改为pivot = array[0]; ,它中断了,给了我一个stackoverflow异常。 我尝试了其他值,但似乎只喜欢中间点。 为什么会这样?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM