自上而下的递归方法不起作用,不知道如何修复它

我的“数据结构与算法课”有一个家庭作业问题 - 用 Java 实现自上而下的递归合并排序。通过生成 100 个数字的随机序列,以原始未排序形式打印它们,对它们进行排序,然后按排序顺序打印出来,来证明您的排序是有效的。

我做了一些编码,似乎是正确的,但我收到了一个错误,并且无法弄清楚我做错了什么。

class RecursiveMergeSort

{

void TopDownMergeSort(int[] mainArray, int[] copyArray) // mainArray, copyArray, int n

{

    CopyArray(mainArray, copyArray);

    Split(copyArray, 0, 100, mainArray);

}


private void Split(int[] copyArray, int start, int end, int[] mainArray)

{

    if(end - start < 2)

    {

        return;

    }

    int middle = (end + start) / 2;

    Split(mainArray, start, middle, copyArray);

    Split(mainArray, start, end, copyArray);

    CombineArray(copyArray, start, middle, end, mainArray);

}


private void CombineArray(int[] mainArray, int start, int middle, int end, int[] copyArray)

{

    int s = start; //a

    int m = middle; //b


    for (int i = start; i < end; i++)

    {

        if(s < middle && (m >= end || mainArray[s] <= mainArray[m]))

        {

            copyArray[i] = mainArray[s];

            s = s + 1;

        }

        else

        {

            copyArray[i] = mainArray [m];

                    m = m + 1;

        }

    }


}


private void CopyArray(int[] mainArray, int[] copyArray)

{

    System.arraycopy(mainArray, 0, copyArray, 0, 100);

}


void UnsortedArray(int[] unsortedArray)

{

    for(int i = 0; i < unsortedArray.length; i++)

    {

        int random = (int)Math.floor(Math.random() * 100) + 1;

        unsortedArray[i] = random;

        System.out.println("\t" + i + unsortedArray[i]);

    }

}


void SortedArray(int[] unsortedArray)

{

    for(int i = 0; i < unsortedArray.length; i++)

    {

        System.out.println("\t: " + i + unsortedArray[i]);

    }

}

}




Helenr
浏览 104回答 1
1回答

ITMISS

&nbsp; int middle = (end + start) / 2;&nbsp; &nbsp; Split(mainArray, start, middle, copyArray);&nbsp; &nbsp; Split(mainArray, start, end, copyArray);&nbsp; &nbsp; CombineArray(copyArray, start, middle, end, mainArray);应该&nbsp; &nbsp; int middle = (end + start) / 2;&nbsp; &nbsp; Split(mainArray, start, middle, copyArray);&nbsp; &nbsp; Split(mainArray, middle, end, copyArray);&nbsp; &nbsp; CombineArray(copyArray, start, middle, end, mainArray);你非常接近,只是第二个递归调用的开始索引应该是从中间索引到结束,而不是再次开始一直到结束(导致堆栈溢出错误)附带说明 - 您应该重命名您的方法以符合标准,例如:它们以小写字母开头,例如:private void combineArray(int[] mainArray, int start, int middle, int end, int[] copyArray)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java