在将数组传递给函数时,我无法让冒泡排序在函数中工作
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 个错误:
在第 13 行,您将 numbers[]
传递给升序函数。这是错误的,当你调用一个函数时,你永远不能用 []
传递任何东西。当你在函数的参数列表中写 int numbers[]
时,这意味着你希望函数接受一个指向数字的指针,你只是在向编译器声明它。所以它应该只是 ascending(numbers, size);
第 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
#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 个错误:
在第 13 行,您将
numbers[]
传递给升序函数。这是错误的,当你调用一个函数时,你永远不能用[]
传递任何东西。当你在函数的参数列表中写int numbers[]
时,这意味着你希望函数接受一个指向数字的指针,你只是在向编译器声明它。所以它应该只是ascending(numbers, size);
第 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