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

合并排序,合并期间数组重新排列。

合并排序,合并期间数组重新排列。

小唯快跑啊 2021-11-11 14:22:13
我的数组在合并排序时遇到了一些麻烦。在我遇到的每种情况下,合并都可以正常工作,直到它遇到递归方法并将先前合并的数组发回。大多数情况下,它重新排列已经排序的数组并弄乱了第二个合并方法。例如: (3)(2)(1)(4) -> (2,3)(1,4) -> (1,3,2,4) 将是一个可能的结果。我做错了什么可能导致这种情况?public static int[] mergeSort(int[] numbers) {     if (numbers.length == 1) {       return numbers; }     int[] leftSide = new int[numbers.length/2];     int[] rightSide = new int[numbers.length-leftSide.length];     System.arraycopy(numbers,0,leftSide,0,leftSide.length);     System.arraycopy(numbers,leftSide.length,rightSide,0,rightSide.length);     mergeSort(leftSide);     mergeSort(rightSide);     displayArray(leftSide);     displayArray(rightSide);     numbers = merge(leftSide,rightSide);     System.out.println("=============");     return numbers;   }   public static int[] merge(int[] left, int[] right) {     int[] temp = new int[left.length+right.length];     int l = 0;     int r = 0;     int t = 0;     while (l < left.length && r < right.length) {       if (left[l] > right[r]) {         temp[t] = right[r];         r++;         t++; }       else {         temp[t] = left[l];         l++;          t++; }     }//while     while (l < left.length) {       temp[t] = left[l];         l++;         t++; }     while (r < right.length) {         temp[t] = right[r];         r++;          t++; }     displayArray(temp);     return temp;   }
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

mergeSort 函数返回一个排序的数组,我们没有跟踪它。由于已排序的数组(左和右)丢失,合并函数再次选取未排序的左右数组。解决方法是更新


mergeSort(leftSide);

mergeSort(rightSide);


leftSide = mergeSort(leftSide);

rightSide = mergeSort(rightSide);

这会将它们更新为各自的排序值


查看完整回答
反对 回复 2021-11-11
  • 1 回答
  • 0 关注
  • 150 浏览

添加回答

举报

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