使用递归合并排序

时间:2017-07-17 14:07:35

标签: java sorting recursion

我尝试实现递归合并排序,但是我收到了堆栈溢出错误。

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;
        }
    }

2 个答案:

答案 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。因此,您的终止条件永远不会成立,这是无限递归。