大家!
我的Java中的quicksort实现存在一些stackoverflow问题,其中包含随机化的pivot元素,用于快速排序的每个递归调用,如下面的代码所示。我的问题是我的代码中有三个(!)位置的stackoverflow:
import java.util.Random;
/**
* Write a description of class QuickSort1 here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class QuickSort1 implements IntSorter
{
private int[] v;
private Random randomGenerator;
public QuickSort1()
{
randomGenerator = new Random();
}
public void sort(int[] v)
{
this.v = v;
if(this.v.length > 0) {
quickSort(this.v, 0, this.v.length-1);
}
else {
return;
}
}
private void quickSort(int[] v, int first, int last)
{
if(v.length < 2)
return;
else {
int First = first;
int Last = last;
int pivot = v[randomGenerator.nextInt(v.length)];
while(First <= Last) {
while(v[First] < pivot) {
First++;
}
while(v[Last] > pivot) {
Last--;
if(Last==0)
break;
}
if(First<=Last) {
int temp = v[First];
v[First] = v[Last];
v[Last] = temp;
First++;
Last--;
}
}
if(first < Last)
quickSort(v, first, Last);
if(First < last)
quickSort(v, First, last);
}
}
}
调用sort(int [] v)时得到的错误消息如下:
java.lang.StackOverflowError
at java.util.Random.nextInt(Random.java:307)
at QuickSort1.quickSort(QuickSort1.java:37)
at QuickSort1.quickSort(QuickSort1.java:60)
at QuickSort1.quickSort(QuickSort1.java:58)
这些消息表示当pivot元素由0(包括)和v.length(不包括)之间的范围内的随机生成器决定时,以及在quickSort方法结束时的两个递归方法调用时,行的堆栈溢出。
奇怪的是,当我想对几个元素进行排序时,实现工作正常。当我想对1000个元素进行排序时,这个实现的问题就开始出现了,然后发生了StackOverflowExceptions,第58和60行的错误在终端中重复了很多次。
我非常感谢你们的帮助:)
提前致谢!
/困惑的家伙
答案 0 :(得分:1)
if(first < Last)
quickSort(v, first, Last);
if(First < last)
quickSort(v, First, last);
v是完整的数组。它永远不会达到小于2的长度。无论是分区v还是将基本情况条件调整为
last - first < 2