简单的QuickSort算法给出堆栈溢出错误?

时间:2014-01-27 18:24:55

标签: java quicksort stack-overflow

我的朋友有一个小问题,我知道了。他写了一个简单的(他在学校里得到它)QuickSort算法它产生了一个StackOverflow错误。我知道这意味着它在某个地方调用自己递归太多次,但我无法得到逻辑错误 - 请帮助我!

这是代码(我只留下一些代码,因为它只是在2个文本区域中显示):

int array [] = new int [10];
...
 public static void quicksort (int array[],int l,int r){
int i = l;
int j = r;
int mitte = array [(l+r)/2];

while (i<j) {
  while  (array[i]<mitte) {
    i++;
  } // end of if
  while  (mitte<array[i]) {
    j--;
  } // end of if
  if (i<=j) {
    int merke =array[i];
    array[i] = array [j];
    array [j] = merke ;
    i++;
    j--;
  } // end of if
  if (i<j) {
    quicksort(array,l,j);
  } // end of if
  if (l<r) {
    quicksort(array,l,r);
  } // end of if
} // end of while
}

它被称为:

 quicksort(array,0,9);

但是,如果我们调用它并且2个数字是相同的,则它不会溢出。

如果需要更多代码,请参阅以下有关pastebin的完整代码:http://pastebin.com/cwvbwXEu

3 个答案:

答案 0 :(得分:1)

这个电话:

if (l<r) {
  quicksort(array,l,r);
}

使用传入的相同参数递归调用quicksort,而不是使用较小的子问题进行调用来解决。因此它将无限递归。

答案 1 :(得分:1)

if (l<r) 
quicksort(array,l,r);

总是小于r吗?这将导致无限递归,这就是为什么如果两个值都相同则不会出现溢出的原因。

答案 2 :(得分:1)

首先,你在这里有一个无限循环:

while  (mitte<array[i]) {
    j--;
  } // end of if

需要array[j]

其次(并导致无限递归),在第二次调用快速排序

if (l<r) {
  quicksort(array,l,r);
} // end of if

在递归中,你总是需要缩短你自称的范围,否则它将是无限的。我还没弄清楚你在做什么,但我认为你的意思是:

if (i<r) {
   quicksort(array,i,r);
 } // end of if