2015-11-07 54 views
0

我對Java排序算法很陌生,在合併排序算法中找不到錯誤。結果不斷給我輸入數組,而不是一個排序的結果。任何幫助或建議,將不勝感激。Java合併排序錯誤?繼續獲得輸入值?

public class Mergesort { 

    static int [] finalarray = new int[12]; 

    public static void main(String [] args) 
    { 
     int [] numbers = {6,10,15,4,30,60,24,90,76,100,120,140}; 

     int [] tem = new int[12]; 

     mergesort(numbers, tem, 0, (numbers.length - 1)); 

     for (int i = 0; i < 12; i++) 
     { 
      System.out.println("" +finalarray[i]); 
     } 
    } 

    public static void mergesort(int [] num, int [] temp, int first,int last) 
    { 
     if (first < last) 
     { 
      int mid = (first + last)/2; 
      mergesort(num, temp, first,mid); 
      mergesort(num, temp, mid + 1, last); 
      merge(num,temp,first,mid,last); 
     } 
    } 

    public static void merge(int [] num, int [] temp, int firstpos, int midpos, int lastpos) 
    { 
     int half1begin = firstpos; 
     int half1end = midpos; 
     int half2begin = midpos + 1; 
     int half2end = lastpos; 
     int numbersIndex = 0; 


     while(half1begin <= half1end && half2begin <= half2end) 
     { 
      if (num[half1begin] <= num[half2begin]) 
      { 
       temp[numbersIndex] = num[half1begin]; 
       ++half1begin; 
      } 
      else 
      { 
       temp[numbersIndex] = num[half2begin]; 
       ++half2begin; 
      } 

      numbersIndex++; 
     } 

     while(half1begin <= half1end) 
     { 
      temp[numbersIndex++] = num[half1begin++]; 
     } 

     while(half2begin <= half2end) 
     { 
      temp[numbersIndex++] = num[half2begin++]; 
     } 

     for (int i = 0; i < 12; i++) 
     { 
      finalarray[i] = temp[i]; 
     } 
    } 
} 

回答

1

我改變了的合併方法爲以下:

public static void merge(int [] num, int [] temp, int firstpos, int midpos, int lastpos) 
{ 
    int half1begin = firstpos; 
    int half2begin = midpos + 1; 
    int numbersIndex = firstpos; 

    //Copies the original array into the temp array 
    for (int i = 0; i < 12; i++) { 
     temp[i] = num[i]; 
    } 

    //Copies the smallest value from either side to the original array 
    while((half1begin <= midpos) && (half2begin <= lastpos)) 
    { 
     if (temp[half1begin] <= temp[half2begin]) 
     { 
      num[numbersIndex] = temp[half1begin]; 
      ++half1begin; 
     } 
     else 
     { 
      num[numbersIndex] = temp[half2begin]; 
      ++half2begin; 
     } 

     numbersIndex++; 
    } 

    //Copies the rest of the left side of the array into original 
    //No need to copy the right side 
    while(half1begin <= midpos) 
    { 
     num[numbersIndex++] = temp[half1begin++]; 
    } 
} 

主要變化初始化臨時陣列每一輪的Num陣列,並且同時內圍繞交換Num和溫度的訂單循環。

您使用的原始方法不起作用,因爲在while循環中用於比較的數組每次運行都完全相同,所以它不會執行任何操作。

此外,您不需要創建一個新的finalarray來存儲值;在main方法中從數組數組打印它就足夠了。不過,如果您願意,可以使用arraycopy複製到最終數組。

...道歉,如果我有任何這些錯誤,因爲我不是那麼精通這個。

Source