Сортировка слиянием, перестановка массивов при слиянии.Джава - PullRequest
0 голосов
/ 11 октября 2018

У меня возникли проблемы с массивами с сортировкой слиянием.В каждом случае, слияние работает нормально, пока не достигнет рекурсивного метода и не отправит ранее слитый массив обратно.В большинстве случаев это переставляет массивы, которые уже были отсортированы, и портит второй метод слияния.Например: (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 Ответ

0 голосов
/ 11 октября 2018

Функция mergeSort возвращает отсортированный массив, который мы не отслеживаем.Так как отсортированный массив (левый и правый) потерян, функция слияния снова выбирает несортированный левый и правый массив.Исправление будет заключаться в обновлении

mergeSort(leftSide);
mergeSort(rightSide);

до

leftSide = mergeSort(leftSide);
rightSide = mergeSort(rightSide);

Это обновит их до соответствующих отсортированных значений

...