为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Helenr 2023-12-21 10:49:57
我的“数据结构与算法课”有一个家庭作业问题 - 用 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]);    }}}
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

  int middle = (end + start) / 2;

    Split(mainArray, start, middle, copyArray);

    Split(mainArray, start, end, copyArray);

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

应该


    int middle = (end + start) / 2;

    Split(mainArray, start, middle, copyArray);

    Split(mainArray, middle, end, copyArray);

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

你非常接近,只是第二个递归调用的开始索引应该是从中间索引到结束,而不是再次开始一直到结束(导致堆栈溢出错误)


附带说明 - 您应该重命名您的方法以符合标准,例如:它们以小写字母开头,例如:


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



查看完整回答
反对 回复 2023-12-21
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信