2012-07-09 77 views
-3

好的,我知道這個問題沒有顯示研究工作,但我一直在經歷這個代碼很多次,我無法弄清楚我做錯了。我知道有很多Mergesort實現的例子,但我想按照我的方式來做。任何幫助表示讚賞,謝謝。Debugging Mergesort Implementation

import java.util.Scanner; 
public class MergeSort 
{ 
    public static int[] mergeSort(int[] arr) 
    { 
     if (arr.length > 1) 
     { 
      int[] arr1 = splitLeft(arr); 
      int[] arr2 = splitRight(arr); 
      arr1 = mergeSort(arr1); 
      arr2 = mergeSort(arr2); 
      return merge(arr1, arr2); 
     } 
     else 
      return arr; 
    } 

    public static int[] splitLeft(int[] arr) 
    { 
     int middle = arr.length/2; 
     int[] newarr = new int[middle]; 
     for (int i = 0; i < middle; i++) 
      newarr[i] = arr[i]; 
     return newarr; 
    } 

    public static int[] splitRight(int[] arr) 
    { 
     int middle = arr.length/2; 
     int[] newarr = new int[arr.length - middle]; 
     for (int i = 0; i + middle < arr.length; i++) 
      newarr[i] = arr[i + middle]; 
     return newarr; 
    } 

    public static int[] merge(int[] arr1, int[] arr2) 
    {  
     int[] sorted = new int[arr1.length+arr2.length]; 

     int i1 = 0; 
     int i2 = 0; 
     int i = 0; 

     while (i1 < arr1.length && i2 < arr2.length) 
     { 
      if (arr1[i1] < arr2[i2]) 
      { 
       sorted[i] = arr1[i1]; 
       i1++; 
      } 

      else 
      { 
       sorted[i] = arr2[i2]; 
       i2++; 
      } 
     i++; 
     } 

     while (i1 < arr1.length) 
     { 
      sorted[i] = arr1[i1]; 
      i1++; 
      i++; 
     } 

     while (i2 < arr2.length) 
     { 
      sorted[i] = arr1[i2]; 
      i2++; 
      i++; 
     } 
     return sorted; 
    } 

    public static int getNum(int x) 
    { 
     int num = (int)(Math.random()*x + 1); 
     return num; 
    } 

    public static void printArr(int[] arr) 
    { 
     System.out.println(); 
     for (int i = 0; i < arr.length; i++) 
      System.out.println(arr[i]); 
    } 

    static Scanner reader = new Scanner(System.in); 
    public static void main(String [ ] args) 
    { 
     int i; 

     System.out.println("Type the length of the array"); 
     int n = reader.nextInt(); 

     System.out.println("Type the range of the random numbers generator"); 
     int range = reader.nextInt(); 

     int[]arr = new int[n]; 

     for (i = 0; i < n; i++) 
      arr[i] = getNum(range); 

     printArr(arr); 

     int[] sorted = new int[n]; 
     sorted = mergeSort(arr); 

     printArr(sorted); 
    } 
} 
+0

這裏有什麼問題? – 2012-07-09 20:32:51

+0

我們可以看到你的「合併」功能嗎? – templatetypedef 2012-07-09 20:33:29

+0

分割函數有問題嗎? – amiregelz 2012-07-09 20:33:46

回答

2

我認爲問題出在您的splitRight函數中。考慮以下代碼:

for (int i = middle; i < arr.length; i++) 
    newarr[i] = arr[i]; 

這會嘗試將i個元素從arr複製到的newarri個位置,但是這是不正確。例如,如果陣列arr有十大要素,你要的arr複製件5至newArr 0地位,arr元件6定位的newarr 1等

爲了解決這個問題,考慮嘗試這樣的東西:

for (int i = 0; i + middle < arr.length; i++) 
    newarr[i] = arr[i + middle]; 

希望這有助於!

+0

當試圖分割長度不是偶數的數組時,它看起來不起作用,但我認爲arr.length-middle應該處理這個問題。你有什麼想法可能會導致這種情況? – amiregelz 2012-07-09 21:07:30

+0

沒有看到更多的代碼,我不知道我可以幫忙。您應該將完整的代碼(包括'merge')作爲單獨的問題與上述錯誤修復一起發佈。 – templatetypedef 2012-07-09 21:08:09

+0

我加了整個代碼。我將我的'合併'函數與互聯網上的其他示例進行了比較,它應該按照預期工作,但是我得到了ArrayIndexOutOfBounds,因此'merge'函數有可能出錯。 – amiregelz 2012-07-10 13:53:21

0

當你

for (int i = middle; i < arr.length; i++) 
      newarr[i] = arr[i]; 

你肯定要求在原數組中的位置,並在同一時間,新數組中尋找他們(這恰好是短)。