{
int pos=Qpass(a, low, high)
qsort(a,low,pos-1)
qsort(a,pos+1,high)
}
没有结束条件,肯定会一致无限地递归下去,直到栈溢出了。。
快速排序的终止条件是:low>=high
即改为
private static void qsort(int[]a,int low,int high)
{
if( low <high)
{
int pos=Qpass(a, low, high)
qsort(a,low,pos-1)
qsort(a,pos+1,high)
}
}
栈溢出。Java里面每个线程都有独立的、固定大小的栈空间, Java在解释执行的时候采用的是栈式的架构。 方法调用、方法内的局部变量都是在栈空间申请的。 空间的大小依赖于JDK版本,JDK1.6应该是512K,超过了这个空间就会产生StackOverFlow。死循环本身是不会StackOverflow的,只有无限递归的时候会出现。原则上循环嵌套次数本身是没有限制的,限制的是占用的栈空间,如果你的方法里定义了很多很多变量,栈空间就会用完得比较快。如果你的软件不是很庞大,那么你的程序中出现了无限的递归的情况可能产生这个错误。
1. 应该是您的递归算法调用的层级太多导致的。优化下算法,让调用层级减低才行。2. 这种情况自己维护个栈序列,用循环的方式来处理应该就可以了。
例如可以是:
1. (start,end)入栈
2. 栈是否为空,若为空则退出
3. 弹出栈定元素,如果start-end<breakpoint使用插入排序,完成后回到2。
否则对[start,end]序列进行划分,将小于和大于choosePivot(a,start,end)的区间入栈
(minstart,minend), (maxstart, maxend)
4. 重复2,3,直到栈为空