2016-04-23 2 views
0

В классе информатики появился этот пример для сортировки слияния. Как в итоге изменяется массив «array1», хотя функция «mergeSort()» ничего не возвращает? Я сбит с толку. Я спросил своего учителя, но он не уверен.Как возвращаемое значение для этого сортировки сортировки работает?

Может ли кто-нибудь еще мне помочь? Благодаря!

import java.util.Arrays; 

public class MergeSort 
{ 
    public static void main(String[] args) 
    { 
     int[] array1 = {5, 3, 4, 1, 6, 2}; 
     int[] array2 = {5, 6, 4, 8, 9, 7, 3, 1, 2}; 

     System.out.print("First array: "); 
     System.out.println(Arrays.toString(array1)); 
     // System.out.print("Second array: "); 
     // System.out.println(Arrays.toString(array2)); 
     System.out.println(); 

     // sort first array 
     mergeSort(array1); 
     // sort second array 
     // mergeSort(array2); 

     System.out.print("First array sorted: "); 
     System.out.println(Arrays.toString(array1)); 
     // System.out.print("Second array sorted: "); 
     // System.out.println(Arrays.toString(array2)); 
    } 

    /* 
    * Merge sort takes in an array and returns the same array, sorted. 
    */ 
    public static void mergeSort(int[] arr) 
    { 
     int[] temp = new int[arr.length]; 
     mergeSortHelper(arr, 0, arr.length - 1, temp); 
    } 

    public static void mergeSortHelper(int[] arr, int from, int to, int[] temp) 
    { 
     // If the array length is greater than 1 
     if(to - from >= 1) 
     { 
      int mid = (from + to)/2; 
      mergeSortHelper(arr, from, mid, temp); 
      mergeSortHelper(arr, mid + 1, to, temp); 
      merge(arr, from, mid, to, temp); 
      System.out.println(Arrays.toString(arr)); 
     } 
    } 

    public static void merge(int[] arr, int from, int mid, int to, int[] temp) 
    { 
     int i = from;  // track left array position 
     int j = mid + 1; // track right array position 
     int k = from;  // track temp position 

     while(i <= mid && j <= to) 
     { 
      // If the element in the left subarray is less 
      // than the element in the right subarray it 
      // is next in the merged list 
      if(arr[i] < arr[j]) 
      { 
       temp[k] = arr[i]; 
       i++; 
      } 
      else 
      { 
       temp[k] = arr[j]; 
       j++; 
      } 
      k++; 
     } 

     // We may have missed elements from either list 
     while(i <= mid) 
     { 
      temp[k] = arr[i]; 
      i++; 
      k++; 
     } 

     while(j <= to) 
     { 
      temp[k] = arr[j]; 
      j++; 
      k++; 
     } 

     // Copy over from temp to elements 
     for(k = from; k <= to; k++) 
     { 
      arr[k] = temp[k]; 
     } 

    } 
} 
+0

Что это за учитель? –

+0

Почему учитель учит вас, как реализуется mergesort, даже не объясняя, как работают вызовы методов и что происходит с аргументами, которые имеют примитивные типы или ссылочные типы? – Madhusudhan

+0

Если ваш учитель не знает, почему я предлагаю вам перейти на другой раздел, преподаваемый кем-то другим. –

ответ

0

mergeSort() звонки mergeSortHelper() который называет merge().

merge() изменяет массив на линии arr[k] = temp[k];

Поэтому mergeSort() на самом деле изменяет массив, хотя он делает это путем вызова других методов, которые изменяют массив.

0

Извините, о последнем ответе, я не видел никаких сообщений об этом сообщении, поэтому я думал, что никто не ответил.

Я должен уточнить: мой учитель должен научить нас Java, что он и делает, но он также любит много сосредотачиваться на новостях о программировании, таких как «в последнее время есть уязвимое яблоко безопасности» и т. Д. также очень откладывается и не знает, как сохранить класс в очереди, и поэтому в основном каждый человек в моем классе, но я (я единственный человек, который интересуется классом) смотрит видео и играет в игры во время занятий и никогда не делает любая домашняя работа. Мой учитель так откинулся назад, что никого не наказывает, поэтому я становлюсь единственным человеком, который знает что-нибудь о джаве.

Он заставлял нас что-то делать с кодом HS для AP Java, но я был единственным человеком, который действительно делал это вовремя, поэтому мне нечего было делать, кроме осмотра различных методов кодирования на веб-сайте, пока мой учитель ждал мои одноклассники что-то делают для нескольких классов. Когда я оглядывался, я увидел небольшой раздел о слиянии и был приведен этот пример кодом HS. Именно тогда я спросил об этом учителя. Наверное, он так не практиковал, что никогда не преподавал очень много Java, что он не знал ответа. Черт, он даже не помнил, что такое абстрактный класс.

Он единственный учитель по этому предмету в моей школе. Я думаю, что в следующем году он будет немного более строгим, потому что из того, что я слышал, его класс по информатике на низком уровне действительно делал вещи. Возможно, я дал ему немного надежды, что есть студенты, которые действительно заботятся об информатике.