c - 用于排序的递归 C 程序给出意外的输出
问题描述
我正在尝试创建一个递归函数来对数组进行排序。这个想法是每当索引较小的元素较大时交换两个元素,因为我们想要按升序排序。以下是我为此编写的 C 程序
void sort(int a[30], int n)
{
int m = 0,i,temp;
for(i = 0;i<n-1,m==0;i++)
{
printf("The array when i is %d is %d",i,a[0]);
for(i=1;i<n;i++)
printf(",%d",a[i]);
printf("\n");
if(a[i]>a[i+1])
{
temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
m = 1;
}
}
if(m==0)
{
printf("The sorted array is %d",a[0]);
for(i=1;i<n;i++)
printf(",%d",a[i]);
}
else
sort(a,n);
}
int main()
{
int a[30],n;
printf("Enter the number of elements\n");
scanf("%d",&n);
if(n>30||n<1)
printf("The number of elements should be a natural number not exceeding 30");
else
{
int i;
for(i=0;i<n;i++)
{
printf("Enter element number %d\n",i+1);
scanf("%d",&a[i]);
}
sort(a,n);
}
return 0;
}
这个程序没有给出想要的输出,它进入了一个很长的循环(即使 n=4),然后突然停止。
有人可以发现问题吗?
解决方案
在 if 语句的条件下
for(i = 0;i<n-1,m==0;i++)
这里使用了逗号运算符。它的值是m==0的右手操作数的值。
我想你的意思是
int m = 1;
for (i = 0; m != 0 && i<n-1; i++ )
{
m = 0;
//...
也就是说,如果在内部循环中没有交换数组的元素,这意味着数组已经排序,那么 m 将等于 0,并且外部循环将停止其迭代。
此外,对于内部循环,您必须使用另一个变量作为索引 not i
。
这是一个演示程序,显示了如何基于方法冒泡排序实现该功能。
#include <stdio.h>
void bubble_sort( int a[], size_t n )
{
if ( !( n < 2 ) )
{
size_t last = 1;
for ( size_t i = last; i < n; i++ )
{
if ( a[i] < a[i-1] )
{
int tmp = a[i];
a[i] = a[i-1];
a[i-1] = tmp;
last = i;
}
}
bubble_sort( a, last );
}
}
int main(void)
{
int a[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
const size_t N = sizeof( a ) / sizeof( *a );
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' );
return 0;
}
程序输出为
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9