2016-06-14 52 views
-1

我已經開始在java中編程並試圖學習合併排序。我得到了算法,並用它編碼。我不明白我錯了什麼。有人可以幫助我這個瞭解合併排序和調試此代碼。如何合併排序?只需要知道我在哪裏弄錯了

public class Main { 

    public static void main(String[] args) { 

    // Merge Sort 

    int[] myArray = {2, 4, 1, 6, 8, 5, 3, 7}; 


     mergeSort(myArray); 
     System.out.println((Arrays.toString(myArray))); 
    } 
    public static void mergeSort(int []toSortArray){ 
     int n= toSortArray.length; 
     if (n < 2) { 
     return; 
     } 
    int mid = n/2; 
    int [] Left= new int [mid]; 
    int []Right = new int[n-mid]; 
    for(int i=0;i<mid-1;i++){ 
     Left[i]=toSortArray[i]; 
    } 
    for(int i=mid;i<n-1;i++){ 
     Right[i-mid]=toSortArray[i]; 
    } 
    mergeSort(Left); 
    mergeSort(Right); 
    merge(Left,Right,toSortArray); 

} 

public static void merge(int[] Left, int [] Right, int []SortedArray){ 
    int nL = Left.length; 
    int nR= Right.length; 

    int i=0;//Index position for left array 
    int j=0;// index of position of Right array 
    int k=0;// Index position of sorted Array 

    while (i<nL && j<nR){ 
     if (Left[i]<Right[j]) { 
      SortedArray[k] = Left[i]; 
      i++; 
      k++; 
     } 
     if (Right[j]<Left[i]){ 
      SortedArray[k] = Right[j]; 
      j++; 
      k++; 
     } 
    } 
    while(i<nL){ 
     SortedArray[k]=Left[i]; 
     i++; 
     k++; 
    } while (j<nR){ 
     SortedArray[k]= Right[j]; 
     j++; 
     k++; 
    } 

} 

} 
+1

您目前得到什麼輸出?你得到一個錯誤,或只是一個不正確的排序數組? –

+0

我認爲你需要在停止條件之前在n == 2的情況下進行排序。 – gba

+0

我沒有得到任何錯誤,但它不工作執行。 – sanj780013

回答

0

在歸併()中,兩個環以複製數據應該是我<中間(未我<中間-1)和i < N(不我< N-1)。

在merge()中,第一個if應該是if(Left [i] < = Right [j])(不僅僅是<)。第二個if(Right [j] < Left [i])可以替換爲else(不需要第二個if)。

下面的代碼似乎工作:

package x; 
import java.util.Arrays; 
public class x { 
    public static void main(String[] args) { 
     int[] myArray = {2, 4, 1, 6, 8, 5, 3, 7}; 
    mergeSort(myArray); 
    System.out.println((Arrays.toString(myArray))); 
    } 

    public static void mergeSort(int []toSortArray){ 
     int n= toSortArray.length; 
     if (n < 2) { 
      return; 
     } 
     int mid = n/2; 
     int []Left = new int [mid]; 
     int []Right = new int[n-mid]; 
     for(int i=0;i<mid;i++){ 
      Left[i]=toSortArray[i]; 
     } 
     for(int i=mid;i<n;i++){ 
      Right[i-mid]=toSortArray[i]; 
     } 
     mergeSort(Left); 
     mergeSort(Right); 
     merge(Left,Right,toSortArray); 
    } 

    public static void merge(int[] Left, int [] Right, int []SortedArray){ 
     int nL = Left.length; 
     int nR= Right.length; 

     int i=0;// index position for Left array 
     int j=0;// index position for Right array 
     int k=0;// index position for Sorted array 

     while (i<nL && j<nR){ 
      if (Left[i]<=Right[j]) { 
       SortedArray[k] = Left[i]; 
       i++; 
       k++; 
      } else { 
       SortedArray[k] = Right[j]; 
       j++; 
       k++; 
      } 
     } 
     while(i<nL){ 
      SortedArray[k]=Left[i]; 
      i++; 
      k++; 
     } while (j<nR){ 
      SortedArray[k]= Right[j]; 
      j++; 
      k++; 
     } 
    } 
} 
+0

我改變了你的想法。該代碼仍然無法正常工作。 – sanj780013

+0

@sanjay - 我更新了我的答案,第一個如果在merge()需要<=(不僅僅是<)。第二個如果可以用其他替換。 – rcgldr

+0

我就像你說的那樣。該程序執行但輸出未排序。 – sanj780013

相關問題