在将数组传递给函数时,我无法让冒泡排序在函数中工作

i cant get bubble sorting to work in function while passing array to the function

#include <stdio.h>
#include <conio.h>
void ascending(int numbers[], int size);
int main()
{
    int size=10, numbers[size], i, order;

    for (i=0; i<10; i++)
    {
        printf("please enter a number:");
        scanf("%d", &numbers[i]);
    }
    ascending(numbers[], size);

}

void ascending(int numbers[], int size)
{
    int temp, i, sflag, count=0;

    do
    {
        sflag = 0;
        for(i=1; i <10; i++)
        {
            if (numbers[i-1] > numbers[i])
            {
                temp = numbers[i-1];
                numbers[i-1] = numbers[i];
                unmbers[i] = temp;
                sflag = 1;
            }
        }
        count++;
    }while(sflag);

    for (i=0; i<10; i++)
    {
        printf("%d\t", numbers[i]);
    }


}

代码在函数中的第一个 if 语句处失败,表示分段错误。 我不确定为什么,我认为我将数组传递给函数的方式可能有误。

您的代码中有 2 个错误:

  1. 在第 13 行,您将 numbers[] 传递给升序函数。这是错误的,当你调用一个函数时,你永远不能用 [] 传递任何东西。当你在函数的参数列表中写 int numbers[] 时,这意味着你希望函数接受一个指向数字的指针,你只是在向编译器声明它。所以它应该只是 ascending(numbers, size);

  2. 第 30 行你打错了,你写了 unmbers[i] = temp;,而它应该是 numbers[i] = temp;

正确代码如下:

#include <stdio.h>
#include <conio.h>
void ascending(int numbers[], int size);
int main()
{
    int size=10, numbers[size], i, order;

    for (i=0; i<10; i++)
    {
        printf("please enter a number:");
        scanf("%d", &numbers[i]);
    }
    ascending(numbers, size);

}

void ascending(int numbers[], int size)
{
    int temp, i, sflag, count=0;

    do
    {
        sflag = 0;
        for(i=1; i <10; i++)
        {
            if (numbers[i-1] > numbers[i])
            {
                temp = numbers[i-1];
                numbers[i-1] = numbers[i];
                numbers[i] = temp;
                sflag = 1;
            }
        }
        count++;
    }while(sflag);

    for (i=0; i<10; i++)
    {
        printf("%d\t", numbers[i]);
    }


}
/******************************************************************************

                            Online C Compiler.
                Code, Compile, Run and Debug C program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <stdio.h>



#include <stdio.h>
#include <conio.h>
void ascending(int numbers[], int size);
int main()
{
    int size=10, numbers[size], i, order;

    for (i=0; i<10; i++)
    {
        printf("please enter a number:");
        scanf("%d", &numbers[i]);
    }
    ascending(numbers, size);

    return 0;
}

void ascending(int numbers[], int size)
{
    int temp, i, sflag, count=0;

    do
    {
        sflag = 0;
        for(i=1; i <10; i++)
        {
            if (numbers[i-1] > numbers[i])
            {
                temp = numbers[i-1];
                numbers[i-1] = numbers[i];
                numbers[i] = temp;
                sflag = 1;
            }
        }
        count++;
    }while(sflag);

    for (i=0; i<10; i++)
    {
        printf("%d\t", numbers[i]);
    }

}

运行 您的代码在 https://www.onlinegdb.com/online_c_compiler#

中稍作修改(使其可以编译)

我没能检测到任何错误

我检查了 3,7,8,8,9,10,11,200,317 和 1,1,1,1,1,1,1,1,1

你的程序中至少有两个错别字。

第一个在这个声明中

ascending(numbers[], size);
                 ^^^

应该有

ascending(numbers, size);

此语句中的第二个

unmbers[i] = temp;
^^^^^^^^

应该有

numbers[i] = temp;

同样在这个函数内声明

for(i=1; i <10; i++)

您使用的是幻数 10 而不是变量 size

然而,您的函数效率低下,因为内部循环总是从 1 迭代到 size

它的更有效的实现可以如下面的演示程序所示。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void bubble_sort( int a[], size_t n )
{
    for ( size_t last = n; !( n < 2 ); n = last )
    {
        last = 0;
        for ( size_t i = 1; i < n; i++ )
        {
            if ( a[i] < a[i-1] )
            {
                int tmp = a[i];
                a[i] = a[i-1];
                a[i-1] = tmp;
                last = i;
            }
        }
    }
}

int main(void) 
{
    enum { N = 10 };
    int a[N];

    srand( ( unsigned int )time( NULL ) );

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t i = 0; i < N; i++ )
        {
            a[i] = rand() % N;
        }

        for ( size_t i = 0; i < N; i++ )
        {
            printf( "%d ", a[i] );
        }
        putchar( '\n' );

        bubble_sort( a, N );

        for ( size_t i = 0; i < N; i++ )
        {
            printf( "%d ", a[i] );
        }
        putchar( '\n' );

        putchar( '\n' );
    }

    return 0;
}

在程序中,一个随机数数组被排序了 10 次。 程序输出可能看起来像这样。

4 0 1 0 5 7 1 1 5 2 
0 0 1 1 1 2 4 5 5 7 

8 1 1 0 7 1 3 1 1 0 
0 0 1 1 1 1 1 3 7 8 

6 0 8 2 8 3 7 4 7 8 
0 2 3 4 6 7 7 8 8 8 

2 1 0 3 4 5 3 7 8 0 
0 0 1 2 3 3 4 5 7 8 

9 6 3 0 9 0 4 4 4 5 
0 0 3 4 4 4 5 6 9 9 

5 2 7 5 4 7 0 1 2 7 
0 1 2 2 4 5 5 7 7 7 

1 4 1 4 9 5 1 4 4 0 
0 1 1 1 4 4 4 4 5 9 

6 5 8 0 7 9 2 1 4 6 
0 1 2 4 5 6 6 7 8 9 

9 1 9 6 6 5 4 8 9 8 
1 4 5 6 6 8 8 9 9 9 

5 2 4 6 6 5 3 0 2 7 
0 2 2 3 4 5 5 6 6 7 

如果您要使用相同的排序函数按升序和降序对数组进行排序,那么该函数看起来就像下面的演示程序所示。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void bubble_sort( int a[], size_t n, int cmp( int, int ) )
{
    for ( size_t last = n; !( n < 2 ); n = last )
    {
        last = 0;
        for ( size_t i = 1; i < n; i++ )
        {
            if ( cmp( a[i], a[i-1] ) )
            {
                int tmp = a[i];
                a[i] = a[i-1];
                a[i-1] = tmp;
                last = i;
            }
        }
    }
}

int ascending( int x, int y )
{
    return x < y;       
}

int descending( int x, int y )
{
    return y < x;
}

int main(void) 
{
    enum { N = 10 };
    int a[N];

    srand( ( unsigned int )time( NULL ) );

    for ( size_t i = 0; i < N; i++ )
    {
        a[i] = rand() % N;
    }

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", a[i] );
    }
    putchar( '\n' );

    bubble_sort( a, N, ascending );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", a[i] );
    }
    putchar( '\n' );

    bubble_sort( a, N, descending );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%d ", a[i] );
    }
    putchar( '\n' );


    return 0;
}

程序输出可能看起来像

9 0 1 6 0 8 7 4 9 4 
0 0 1 4 4 6 7 8 9 9 
9 9 8 7 6 4 4 1 0 0