我的“数据结构与算法课”有一个家庭作业问题 - 用 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)
添加回答
举报
0/150
提交
取消