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

我的数组在合并排序时遇到了一些麻烦。在我遇到的每种情况下,合并都可以正常工作,直到它遇到递归方法并将先前合并的数组发回。大多数情况下,它重新排列已经排序的数组并弄乱了第二个合并方法。例如: (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;

   }



小唯快跑啊
浏览 151回答 1
1回答

ibeautiful

mergeSort 函数返回一个排序的数组,我们没有跟踪它。由于已排序的数组(左和右)丢失,合并函数再次选取未排序的左右数组。解决方法是更新mergeSort(leftSide);mergeSort(rightSide);到leftSide = mergeSort(leftSide);rightSide = mergeSort(rightSide);这会将它们更新为各自的排序值
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java