2012-11-25 65 views
1

我的氣泡排序代碼只是交換第一個數組項目。所有其他項目都保留爲0.我認爲我的嵌套循環是錯誤的或者我還沒有能夠正確診斷它。所以這裏是我的代碼。爪哇Bubblesort只交換第一個數組項目

public void swap(int i, int j) { 

    int temp; 

    temp = i; 
    i = j; 
    j = temp; 
} 


public void sortArray(int [] sourceArray, int [] targetArray, int allArraySize){ 

    for(int i = 0; i < allArraySize; i++) { 
     targetArray[i] = sourceArray[i]; 
     for (i = 0; i < allArraySize; i++) { 
      for(int j = i+1; j < allArraySize;j++) { 
       if(targetArray[i] > targetArray[j]) { 
        swap(i, j); 
       } 
      } 

     } 

    } 
} 

非常感謝您的反饋意見。我(顯然)是編程新手。我已將我的代碼更改爲此。

public void sortArray(int [] sourceArray, int [] targetArray, int allArraySize){ 
    int temp; 

    for(int i = 0; i < allArraySize; i++) { 
     targetArray[i] = sourceArray[i]; 
     for (i = 0; i < allArraySize; i++) { 
      for(int j = i+1; j < allArraySize;j++) { 
       if(targetArray[i] > targetArray[j]) { 
        temp = targetArray[i]; 
        targetArray[i] = targetArray[j]; 
        targetArray[j] = temp; 
       } 
      } 

     } 

    } 
} 

,結果目前還只能換1項,但現在它是最後1如果有人仍然能夠幫助我將不勝感激。

回答

3

原因在this post中詳細解釋。總之,java按值傳遞參數,並且您的swap方法僅交換局部變量,但對sortArray方法中的變量沒有影響。

一個簡單的解決方法是將代碼swap直接包含在您的if中。注意:我沒有檢查你的其他代碼。例如,你可能打算交換數組中的元素而不是索引。

+2

加上,爲了做到這一點在swap()方法中,你需要像這樣:'void swap(int i,int j,int [] arr){int temp = arr [i]; arr [i] = arr [j]; arr [j] = temp; }' – amit

1

您正在使用我計數器兩次:

for(int i = 0; i < allArraySize; i++) { 
    targetArray[i] = sourceArray[i]; 
     for (i = 0; i < allArraySize; i++) { 
     ... 

可能內環正在改寫了在你的外循環使用的I計數器。

0

(請注意,這是我的第一篇到計算器。我在許多語言中,沒有一個是真正面向對象的。我一直在攻擊的Java一個月左右的空餘時間進行編程。)

正如msg 1中的原始代碼一樣,我覺得需要通過一個單獨的過程來進行交換,因爲在Pascal,VBasic等中這樣做的工作非常棒(並且受到鼓勵),作爲「分而治之」征服「編程實踐。所以我也很困惑,爲什麼我的相同例程在Java中不起作用...直到我re -read關於參數傳遞。我終於明白了,陣列本身需要通過以改變其內容。

public static void swap(int [] a, int i, int j) { 
    int c = a[i]; 
     a[i] = a[j]; 
     a[j] = c; 
    } 

上述工作對我來說,並不亞於我在努力吸收Java的,實際上,我自豪,我終於想通了。但是,天哪......常常令人困惑的事情,是吧?

另一方面,我想我通過參考瞭解了什麼意味着以及如何應付它。

而且我想我不知不覺封裝交換方法的運作,從而跟隨一個O-O宗旨。那麼......雙倍好?

但是,這讓我問:這只是一個愚蠢的想法,「分而治之」排序到這種程度?畢竟,將3線交換程序與其他排序程序聯繫起來是常識,但是我的方法很愚蠢,或者如果不是「最好的」,那麼至少是「良好的」Java練習?