C语言中的递归冒泡排序

C语言中的递归冒泡排序,c,sorting,recursion,bubble-sort,C,Sorting,Recursion,Bubble Sort,我无法在下面愚蠢的递归冒泡排序代码中找到错误。有人能告诉我为什么它不能正常工作吗?提前谢谢 #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)

我无法在下面愚蠢的递归冒泡排序代码中找到错误。有人能告诉我为什么它不能正常工作吗?提前谢谢

#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;
}
#包括
intb[8]={-9,9,89,78,56,45,34,89};
无效打印(int n)
{
int i;
对于(i=0;ib[i])
j=b[i+1];
b[i+1]=b[i];
b[i]=j;
}
rb(n-1);
}
int main()
{
印刷品(8);
rb(8);
印刷品(8);
返回0;
}

for循环中的if语句如下所示,需要在执行交换的三行代码周围添加“{”和“}”。另外,因为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);
}
void rb(int n)
{
如果(n==0)
返回;
int i;
对于(i=0;ib[i]){
/*交换这两个值并尽可能紧密地调整范围j*/
int j=b[i+1];
b[i+1]=b[i];
b[i]=j;
}
}
rb(n-1);
}

for循环中的if语句如下所示,需要在执行交换的三行代码周围添加“{”和“}”。另外,因为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);
}
void rb(int n)
{
如果(n==0)
返回;
int i;
对于(i=0;ib[i]){
/*交换这两个值并尽可能紧密地调整范围j*/
int j=b[i+1];
b[i+1]=b[i];
b[i]=j;
}
}
rb(n-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);
}

如果您将函数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);
}

您的for语句需要修复

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;
        }
    }
(i=0;i{ 如果(b[i+1]>b[i]){ j=b[i+1]; b[i+1]=b[i]; b[i]=j; } }
您的for语句需要修复

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;
        }
    }
(i=0;i{ 如果(b[i+1]>b[i]){ j=b[i+1]; b[i+1]=b[i]; b[i]=j; } }
执行交换的3条语句需要位于
{…}
内部,因此它们都将由
if
控制。如果你想把数字按升序排列,那么,
if
测试也是反向的。当原始数据有误导性(通常很糟糕)时,我质疑重新缩进编辑的有用性缩进可以说是问题的一部分。是的,我怎么能错过括号…愚蠢的…非常糟糕的问题。只是不要因为我无法删除它而否决。这本可以通过以下方式避免。或者,您可以使用适当的IDE来提供正确的标识,因为在nil编辑之后,错误非常明显@WumpusQ。Wumbley我承认我必须查看编辑历史才能理解OP怎么会因为明显的识别而错过它,但我认为nil的编辑是积极的,因为错误仍然存在。进行交换的3条语句需要在
{…}
中,所以它们都将由
if
控制。如果你想把数字按升序排列,那么,
if
测试也是反向的。当原始数据有误导性(通常很糟糕)时,我质疑重新缩进编辑的有用性缩进可以说是问题的一部分。是的,我怎么能错过括号…愚蠢的…非常糟糕的问题。只是不要因为我无法删除它而否决。这本可以通过以下方式避免。或者,您可以使用适当的IDE来提供正确的标识,因为在nil编辑之后,错误非常明显@WumpusQ。Wumbley我承认我必须查看编辑历史才能理解OP怎么会因为明显的识别而错过它,但我认为nil的编辑是积极的,因为错误仍然存在。