作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试实现递归合并排序,但出现堆栈溢出错误。
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;
}
}
最佳答案
问题是你的终止条件:
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
(下一个 end
值)减少到 小于 start
。例如,从范围 [0, 6] 开始,以下是第一次递归调用的 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 项的数组,而不是一个空数组。
关于java - 使用递归进行归并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45146647/
本文实例汇总了Java各种排序算法。分享给大家供大家参考,具体如下: 1. 冒泡排序: ?
1.冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 算法步
前言 平时用惯了高级语言高级工具高级算法,难免对一些基础算法感到生疏。但最基础的排序算法中实则蕴含着相当丰富的优化思维,熟练运用可起到举一反三之功效。 选择排序 选择排序几乎是
我是一名优秀的程序员,十分优秀!