【发布时间】:2017-12-22 03:11:48
【问题描述】:
我尝试实现递归合并排序,但出现堆栈溢出错误。
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;
}
}
【问题讨论】:
-
如果您了解 StackOverflow 的含义,那应该会提示您问题出在哪里。
-
您测试的间隔有多大?你甚至有一个关于小输入的 StackOverflow 吗?如果不是,结果输出是否正确?如果它也发生在小输入上,那么您的递归策略可能会出错。尝试检查您是否在正确的索引上调用该方法,以及您的停止标准是否正确。 StackOverflow 表示您的递归不会停止或太大而无法计算(例如内存不足)。对照维基百科的伪代码检查代码,例如:en.wikipedia.org/wiki/Merge_sort
-
调试工作的痕迹在哪里?如果不出意外,请在每个方法的顶部粘贴一个简单的
print命令以显示输入参数。这会告诉你很多关于递归进程的信息。