我尝试实现递归合并排序,但是我收到了堆栈溢出错误。
public class MergeSort {
static int input[],mid;
public static void mergeSort(int input[],int start,int end ){
if(start>end){
return;
}
// dividing input array into two equal parts
mid=(start+end)/2;
mergeSort(input,start,mid);
mergeSort(input,mid+1,end);
merge(input,start,mid,end);
}
public static void merge(int input[],int start,int mid,int end )
{
int l[]=new int[mid-start+1];
int r[]=new int[end-mid];
for(int i=1;i<end-start+1;i++){
l[i]=input[start+i-1];
}
for(int j=1;j<end-mid;j++){
r[j]=input[mid+j];
}
l[end-start+2]='\u221e';// ASCII vlaue of infinity at the end of left array
r[end-mid+1]='\u221e';//ASCII vlaue of infinity at the end of right array
int i=1,j=1;
for(int k=start;k<end;k++){
if(l[i]<=r[j]){
input[k]=l[i];
i=i+1;
}
else{
input[k]=r[j];
j=j+1;
}
}
答案 0 :(得分:2)
问题是你的终止条件:
<p-pickList
sourceHeader="Available" targetHeader="Selected>
</p-pickList>
在第一次递归中,无法将 if(start > end){
return;
}
// dividing input array into two equal parts
mid=(start+end)/2;
mergeSort(input,start,mid); // <= infinite recursion
mergeSort(input,mid+1,end);
(下一个mid
值)减少为 less 而不是end
。例如,从范围[0,6]开始,这是第一次递归调用的start
值序列:
start, end
你永远不会到0 6 mid = (0+6)/2 = 3
0 3 mid = (0+3)/2 = 1
0 1 mid = (0+1)/2 = 0
0 0 mid = (0+0)/2 = 0
0 0 mid = (0+0)/2 = 0
...
。无限递归。
也许start > end
会对你有用吗?这使得你的基础案例成为一个单项数组,而不是一个空数组。
答案 1 :(得分:1)
你有无限的递归。仔细看看电话:
if(start>end){
return;
}
// dividing input array into two equal parts
mid=(start+end)/2;
mergeSort(input,start,mid);
mergeSort(input,mid+1,end);
merge(input,start,mid,end);
您在第一次通话时始终传递start
的相同值 - 您实际上从未更改过它 - 而mid
永远不会小于start
。因此,您的终止条件永远不会成立,这是无限递归。