2016-04-23 3 views
0

コンピュータサイエンスのクラスでは、マージソートのこの例が出てきました。 "mergeSort()"関数が何も返さないのに、配列 "array1"は最後にどのように変更されますか?私はうんざりしています。私は先生に尋ねたが、彼は確信していない。このマージソートの戻り値の仕組み

他にもこれを手伝ってもらえますか?ありがとう! merge()を呼び出す

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()ラインarr[k] = temp[k];

に配列を変化させるため、mergeSort()は実際に、配列を変更しません。

0

私はこの投稿に関するメールを見たことがありませんでしたので、誰も反応していないと思いました。

私は先生が私たちにJavaを教えてくれると思っていますが、彼は「最近発見されたセキュリティ脆弱性リンゴが見つかりました」などのプログラミングに関するニュースに多くの注目を集めています。クラスを維持する方法もわからないので、基本的に私のクラスのすべての人(私は授業に興味がある唯一の人です)がビデオを見て、クラスでゲームをしています宿題。私の先生はそんなに背を向けるので、誰にも罰せないので、私はJavaについて何も知りません。

彼は私たちにAP JavaのコードHSで何かをしてもらいましたが、私は本当に時間通りにそれを行う唯一の人でしたので、先生が待っていたときには何もしませんでした私のクラスメートはいくつかのクラスのために何かをする。私が見ていたとき、私はmergesortの小さなセクションを見て、この例をコードHSで与えました。それは私が先生にそれについて尋ねた時です。私は彼が答えを知らなかったので、Javaを教えていないので、彼は実践から逃れていると思う。彼は、抽象クラスが何であったかを覚えていませんでした。

彼は私の学校の題材の唯一の教師です。私は自分の下位レベルのコンピューターサイエンスクラスが実際にやっていることを聞いたことがあるので、彼は来年、少し厳しくなるだろうと思う。たぶん私は、実際にコンピュータサイエンスに関心を持つ学生がいることを少しでも希望しています。