Есть ли какая-либо логическая проблема в этом слиянии…?где он терпит неудачу

#java #arrays #mergesort

Вопрос:

Основная функция с двумя массивами, передаваемыми в функции mergeSort, один исходный массив и 2-й временный массив для хранения в нем отсортированных значений.

Я получаю вывод в качестве временного = [3 2 6 4 7 8 5 8 1] когда я печатаю temp в основной функции после сортировки слиянием.

 static void main(String args[])  {  int arr[] = {6,4,7,8,5,3,2,8,1};  int temp[] = new int[arr.length];    for(int i=0;ilt;arr.length();i  )  {  temp[i] = arr[i];  }   mergeSort(arr, temp, 0, arr.length-1);    for(int num : temp)  {  System.out.print(num " ")  }   }  //merge function comparing array and assigning to a new temp array. static void merge(int arr[],int temp[], int l, int mid, int r)  {   int i = l;  int j = mid 1;    int index=l;  while(ilt;=mid amp;amp; jlt;=r)  {   if(arr[i]lt;=arr[j])  {   temp[index] = arr[i];  i  ;  }  else  {  temp[index] = arr[j];  j  ;  }  index  ;  }   while(ilt;=mid)  {  temp[index] = arr[i];  i  ;   index  ;   }    while(jlt;=r)  {  temp[index] = arr[j];  j  ;  index  ;  }  }  //mergeSort function static void mergeSort(int arr[],int temp[], int l, int r)  {  if(llt;r)  {  int mid = l   (r-l)/2;  mergeSort(arr,temp,l,mid);  mergeSort(arr,temp,mid 1,r);  merge(arr,temp,l,mid,r);  }   }  

Я передал два массива в функции mergeSort. Один из них является оригинальным, arr а второй- temp массивом, в котором я храню отсортированные элементы.

Ответ №1:

В вашем merge случае arr необходимо каждый раз переназначать , иначе предыдущий результат слияния бесполезен. (Это всегда тот же самый arr, с которого вы начали)

 static void merge(int arr[],int temp[], int l, int mid, int r)  {  int i = l;  int j = mid 1;  for (int k = l; k lt; r   1; k  ) {  arr[k] = temp[k];  }  int index=l;  while(ilt;=mid amp;amp; jlt;=r)  {  if(arr[i]lt;=arr[j])  {  temp[index] = arr[i];  i  ;  }  else  {  temp[index] = arr[j];  j  ;  }  index  ;  }  while(ilt;=mid)  {  temp[index] = arr[i];  i  ;  index  ;  }   while(jlt;=r)  {  temp[index] = arr[j];  j  ;  index  ;  }  }