我为QuickSort写了这个方法:
public static void QuickSort(int f, int l, int a[])
// f, when passedfrom a method at first is equal to the first index of
//the array, while l is the last. So if I'm passing an array of length
//10, f=0 and l=9
{
int temp;
int mid= (int)(l+f)/2;
for (int r=f; r<l; r++)
{
if(a[r]<a[mid] && r>mid)
{
temp=a[r];
a[r]=a[mid+1];
a[mid+1]=a[mid];
a[mid]=temp;
mid=mid+1;
}
else if(a[r]>a[mid] && r<mid)
{
temp=a[r];
a[r]=a[mid-1];
a[mid-1]=a[mid];
a[mid]=temp;
mid=mid-1;
}
}
if((checksortasc(a))==false)
{
QuickSort(f, mid-1, a);// Exception
QuickSort(mid+1 ,l, a);
}
else
{
for(int r=0; r<10; r++)
System.out.println(a[r]);
System.exit(0);
}
}
public static boolean checksortasc(int a[])
{
for(int i=0;i<a.length-1;i++){
if(a[i]<=a[i+1])
continue;
return false;
}
return true;
}
}
这给了我:
线程“main”中的异常java.lang.StackOverflowError
在我标有上述评论的行上。 为什么抛出此异常,我该怎么做才能修复我的代码? 我是新手,非常感谢任何帮助。
答案 0 :(得分:0)
问题是使用checksortasc
,每次都会返回false。
快速排序的逻辑是将数组分成两部分,下部的每个元素都比较高的部分小。然后,如果每个部分都长于1,则对每个部分应用相同的过程。
请注意,在第一次分离后,数组仍未排序。特别是,上半部分尚未排序,因此您的算法将在您评论的行中继续递归,因为checksortasc
一直返回false。
检查l
和f
之间的区别;如果小于或等于1,则停止递归。