2013-11-15 115 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; 
     } 
    }