如何解决java中混合快速排序法栈溢出(stack overflow)

混合快速排序法中breakpoint如果小于或等于数组长度时,就用插入排序法publicstaticvoidhybridQuickSort(int[]a,intstart... 混合快速排序法中breakpoint如果小于或等于数组长度时,就用插入排序法

public static void hybridQuickSort(int[] a, int start, int end, int breakpoint )
{
intPair pivotPosn;
pivotPosn = new intPair(0,0);

if((end-start)<=breakpoint)
{
insertionSort(a,start,end);
}
else
{
choosePivot(a,start,end);
pivotPosn = partitionWithDuplicates(a, start, end);
hybridQuickSort(a,start,pivotPosn.getEqualsStart(),breakpoint);
hybridQuickSort(a,pivotPosn.getBigsStart(),end,breakpoint);
}
}
这只是部分代码,要解释的是partitionWithDuplicates是分成三部分,分别是小与,等于与大于三部分,而不是普通的小于与大于。inpair是新建的一个类用来储存相等部分开始下标与大于部分开始下标。重复调用小于与大于部分就能完成数组排序。
问题是:长度是1000的数组也能完成排序,但是是当数组长度过大时,比如是20000,出现了stack overflow(栈溢出)。这个问题应该如何解决?
展开
 我来答
Soucula
2013-09-29 · TA获得超过3091个赞
知道小有建树答主
回答量:744
采纳率:93%
帮助的人:74.1万
展开全部
1. 应该是您的递归算法调用的层级太多导致的。优化下算法,让调用层级减低才行。
2. 这种情况自己维护个栈序列,用循环的方式来处理应该就可以了。
例如可以是:
1. (start,end)入栈
2. 栈是否为空,若为空则退出
3. 弹出栈定元素,如果start-end<breakpoint使用插入排序,完成后回到2。
否则对[start,end]序列进行划分,将小于和大于choosePivot(a,start,end);的区间入栈
(minstart,minend), (maxstart, maxend)
4. 重复2,3,直到栈为空
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式