2013-11-15 119 views
0

我無法在下面愚蠢的遞歸氣泡排序代碼中找到錯誤。有人可以告訴它爲什麼不能正常工作嗎?提前致謝。遞歸氣泡排序C

#include <stdio.h> 

int b[8] = { -9, 9, 89, 78, 56, 45, 34, 89 }; 

void print(int n) 
{ 
    int i; 

    for (i = 0; i < n; i++) 
     printf("%d\t", b[i]); 

    printf("\n"); 
} 

void rb(int n) 
{ 
    if(n == 0) 
     return; 

    int i, j; 
    for (i = 0; i < n - 1; i++) { 
     if (b[i + 1] > b[i]) 
      j = b[i + 1]; 

     b[i + 1] = b[i]; 
     b[i] = j; 
    } 

    rb(n - 1); 
} 

int main() 
{ 
    print(8); 
    rb(8); 
    print(8); 

    return 0; 
} 
+1

執行交換的3個語句需要放在'{...}'中,這樣它們全部由'if'來管理。如果你打算把數字按升序排列,那麼'if'測試也是落後的。 –

+1

我質疑重新縮進編輯的有用性,當最初的誤導性(通常很糟糕)縮進首先被認爲是問題的一部分時。 –

+0

是的,我怎麼會錯過括號...愚蠢的...極其糟糕的問題。 –

回答

2

你如果在for循環真的看起來像下面這樣的語句,需要添加「{」和「}」繞三行代碼,做了交換。此外,因爲j僅用於代碼的交換部分。如果你在'if'塊內部有'j'範圍。編譯器會發現這個問題。

void rb(int n) 
{ 
    if(n==0) 
     return; 
    int i; 
    for(i=0;i<n-1;i++) 
    { 
     if(b[i+1]>b[i]) { 
      /* swap the two values and scope j as tightly as possible */ 
      int j=b[i+1]; 
      b[i+1]=b[i]; 
      b[i]=j; 
     } 
    } 
    rb(n-1); 
} 
1

如果您將函數rb()更改爲下面的代碼,它適用於我,從最大到最小排序。

void rb(int n) 
{ 
    if(n == 0) 
     return; 
    for (int i = 0; i < n - 1; i++) { 
     if (b[i + 1] > b[i]) { 
      int j = b[i + 1]; 
      b[i + 1] = b[i]; 
      b[i] = j; 
     } 
    } 
    rb(n - 1); 
} 

輸出:

-9 9 89 78 56 45 34 89 
89 89 78 56 45 34 9 -9 
1

您的語句需要加以固定。

for (i = 0; i < n - 1; i++) { 
     if (b[i + 1] > b[i]) { 
      j = b[i + 1];  
      b[i + 1] = b[i]; 
      b[i] = j; 
     } 
    }