2009-10-22 107 views
0

我想在Java中編寫一個簡單的合併排序程序,我在Eclipse中看到很多紅色。我還是個初學者,不太明白什麼是錯的。謝謝。Java遞歸和合並排序

-Kyle

public class merge{ 
public static int[] mergeSub(int[] array, int left, int right){ 
     if(left<right) 
     { 
     int mid = (left+right)/2; 
     int[] a = mergeSub(array, left, mid); 
     int [] b = mergeSub(array, mid+1, right); 
     return merge(a, b); 

} 
     int[] arr=new int[1]; 
     arr[0]=arr[left]; 
     return arr; 
} 

static int[] merge(int[] left, int[] right){ 
     int index =0; int indexLeft =0; int indexRight=0; 
     int[] result = new int[left.length+right.length]; 

     while(indexLeft<left.length && indexRight<right.length){ 
       if(left[indexLeft] <= right[indexRight]) 
       { 
         result[index]=left[indexLeft]; 
         index++; 
         indexLeft++; 

       } 
       else{ 
         result[index]=right[indexRight]; 
         index++; 
         indexRight++; 
       } 
     } 

     if (indexLeft<left.length){ 
       while(indexLeft<left.length){ 
         result[index]=left[indexLeft]; 
         indexLeft++; index++; 
       } 
     } 
     if (indexRight<right.length){ 
       while(indexRight<left[indexRight]){ 
         result[index]=right[indexRight]; 
         indexRight++; right[indexRight]++; 
       } 
     } 
     return result; 
} 



public static void main(String args[]){ 

     int[] array = {2, 4, 5, 7, 5, 6, 3, 5, 7, 8}; 
     System.out.println(mergeSub(array, 0, 9)); 
}} 
+1

如果您能描述一個或兩個更常見的錯誤,那將會更容易。 – FrustratedWithFormsDesigner 2009-10-22 03:32:41

+0

林不知道,日食似乎編譯它,但仍有麻煩 – Benzle 2009-10-22 04:01:22

+1

花時間正確縮進你的代碼。這將使其更具可讀性和可理解性,並且會暴露各種各樣的錯誤。 Eclipse可以幫助您使用可配置的標準自動格式化,直到找到「樣式」爲止。我只是拒絕去檢查那些格式不一致的代碼;這包括當我導師。 – 2009-10-22 04:14:19

回答

1

你應該使其在Eclipse :-)少紅開始

當鼠標移動到錯誤,它會告訴你是什麼錯誤。例如,在mergeSub代碼中,即使leftright已被聲明爲int參數,您也會將leftright聲明爲本地陣列。以不同方式命名您的本地變量

沖洗並重復。

+0

好的,改名爲左右數組a和b – Benzle 2009-10-22 03:59:48

+0

好。現在開始思考並解決其他錯誤。 – Bombe 2009-10-22 06:02:04

0

我的Java有點生疏,但我相信在Java中,每件事都必須在一個類中。您似乎沒有在您的代碼示例中聲明任何類,但是爲了簡潔起見,您可能只是將它們排除在外?

+0

好的,叫做合併類,也是從第一個答案 – Benzle 2009-10-22 04:00:25

0

首先,您的主要功能mergeSub被聲明爲靜態(這很好),但不能調用非靜態函數。要麼合併靜態,要麼使mergeSub成爲包含類的方法。

+0

我加了一個類合併,應該這樣做嗎? – Benzle 2009-10-22 03:59:14

0

複製/粘貼是你的邪惡。我不想顯示整個工作代碼,所以:在mergeSub

arr[0]=arr[left]; should be arr[0]=array[left]; 

在合併:

while(indexRight < left[indexRight]) should be while(indexRight < right.length) 

right[indexRight]++; should be index++; 

也許還有更多。哦,你不能用println()打印數組,你必須遍歷它。

+0

您也可以使用Arrays.toString(array)打印數組 – finnw 2009-10-22 04:26:43

0

我可以看到一個問題(儘管它沒有解釋編譯時錯誤):

mergeSub()不檢查傳遞一個空數組。如果你傳遞一個空數組,你將在arr[0]=array[left]; statemnt得到ArrayIndexOutOfBoundsException

0

你已經擺脫了紅之後,根據所給出的反饋,你可以用這個one @ codecodex.com比較您的實現看看它如何疊加起來,並學習更多。