2016-05-07 89 views
-1

我想讓我的程序從最小到最大排序這個數組數組,但輸出結果會以其他方式出現。換句話說,我試圖不使用[4],因爲這是算法的作用,但我無法弄清楚。謝謝閱讀。冒泡排序微小的錯誤

輸出: 9月12日3月14日

#include <iostream> 
using namespace std; 

int main() { 
    int a[4] = {12, 9, 14, 3}; 
    int temp; 

    for(int i = 0; i < 4; i++) { 
     if(a[i] > a[i + 1]) { 
      temp = a[i]; 
      a[i] = a[i + 1]; 
      a[i + 1] = temp; 
     } 
     cout << a[i] << " "; 
    } 
    return 0; 
} 
+2

[3 + 1]超出範圍....在[2 + 1]處停止 – T33C

+0

在你的for循環中進行微調,以解決T33C所說的問題,比如'for(int i = 0; i <3; i ++)',之後你得到的輸出是正確的對於給定的代碼。 –

+0

@bkVnet不! http://coliru.stacked-crooked.com/a/5bcd33c4f3d5fa4c –

回答

0

已經有一個稱爲 「算法」 與您可以做一個頭文件:

#include <iostream> 
#include <algorithm> 

using namespace std; 

typedef pair<char, int> new_pair; 

struct sorting{ 
     bool operator() (int i, int j){return i < j;} 
}test_sort; 

int main(void){ 
     int test[4] = {5, 2, 1, 10}; 
     sort(test, test + 3, test_sort); 
     for(int i = 0; i <= 3; i++){ 
       cout <<test[i] << endl; 
     } 
     return 0; 
} 

我希望我幫你。

1

你有三個錯誤:

錯誤1:在循環過程的越界訪問。

此:

for(int i = 0; i < 4; i++) 

應該

for(int i = 0; i < 3; i++) 

其原因是是,如果你使用的第一個(錯誤的)版本,你有一個緩衝區溢出:

if(a[i] > a[i + 1]) // if i == 3, a[3+1] == a[4] == out-of-bounds 

錯誤2:在排序時寫入輸出。在排序的中間

cout << a[i] << " "; 

你這樣做。如果排序尚未完成,則打印出數組的值是沒有意義的。

這應該被放置在排序代碼之外(一旦排序完成):

for (int i = 0; i < 4; ++i) 
    cout << a[i] << " "; 

錯誤3:不正確執行冒泡排序的。

冒泡排序的工作原理是對數據進行多次傳遞,直到檢測到數據已排序。您的代碼只會傳遞一個數據,然後退出。

你需要做的是有一個while或其中的類似循環,for循環。如果數據至少需要再傳遞一次數據,則while循環纔會執行。如果for循環中的if條件從不執行(即沒有發生掉期,因此數據被排序),您將知道數據何時排序。

下面是一個例子:

int temp; 
bool is_sorted = false; 
while (!is_sorted) // execute while data is not sorted 
{ 
    isSorted = true; // assume data is sorted 
    for(int i = 0; i < 3; i++) 
    { 
     if(a[i] > a[i + 1]) 
     { 
      //.. swap the items 
      //... 
      isSorted = false; // swap made, so data was not sorted 
     } 
    } 
}