2016-12-01 104 views
1

當我輸入1,2,3,4,5作爲輸入。輸出很好,因爲它已經從最低到最高排序。但是,當我鍵入5,4,3,2,1它的輸出:冒泡排序:爲什麼它不能正常工作?

4,3,2,1,5

我想要的方式做冒泡排序。

main() { 
     int a[5], i, smallest, temp; 
     cout << "Enter 5 numbers: " << endl; 
     for (i = 0; i <= 4; i++) { 
      cin >> a[i]; 
     } 

     for (i = 0; i <= 4; i++) { 
      smallest = a[i]; 
      if (smallest > a[i+1]) { 
       temp = a[i]; 
       a[i] = a[i+1]; 
       a[i+1] = temp; 
      } 
     } 
     cout << endl << endl; 

     for (i = 0; i <= 4; i++) { 
      cout << a[i] << endl; 
     } 
     system("pause"); 
    } 

我沒有改變我的代碼,這是你有幫助的答覆後:

for (i = 0; i <=4; i++) { 
    smallest = a[i]; 
    for (j = 1; j <= 4; j++) { 
     if (smallest > a[j]) { 
      temp = a[i]; 
      a[i] = a[j]; 
      a[j] = temp; 
     } 
    } 
} 

我不知道爲什麼它不工作。我真的很抱歉,因爲我是編程小白菜,所以請耐心等待我剛剛開始:)

任何幫助將不勝感激。 。

謝謝^^

+4

這聽起來像你可能需要學習如何使用調試器來遍歷你的代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+1

,因爲您只完成一次迭代 –

+0

請比較您的算法[Wikipedia上的定義](https://en.wikipedia.org/wiki/Bubble_sort)。你錯過了一個循環。 – starturtle

回答

6

單通是不夠的,你必須一遍又一遍地掃描陣列,直到沒有進行交換:

bool sorted = false; 

while (!sorted) { 
    sorted = true; 

    for (i = 0; i <= 4 - 1; i++) { /* notice 4 - 1 since we address a[i + 1] */ 
     smallest = a[i]; 

     if (smallest > a[i+1]) { 
      temp = a[i]; 
      a[i] = a[i+1]; 
      a[i+1] = temp; 

      sorted = false; 
     } 
    } 
} 
+0

@Dave:哦!我明白了,謝謝!當然,應該是'4 - 1' –

+2

另一件事,而不是'我<= 4 - 1'爲什麼不使用'i <4'或'i NathanOliver

+0

@NathanOliver:問題包含*錯誤*'我<= 4';把'4 - 1'放在最後,我想用最簡單的方法糾正它:當爲'a [i]'尋址時,'i <= 4','a [i + 1]'爲'i <= 4 - 1'。如果'a [i + 2]'應該是'i <= 4 - 2'等。 –

1

因爲所有的算法呢,是將最大數字到數組的末尾。由於bubble sort的時間複雜度爲O(n²),因此有必要使用兩個嵌套週期。你可以重複你寫的週期,直到數組排序。請注意,這不是非常有效,但它應該工作。

您還應該檢查您是否會訪問超出數組範圍的索引。