用于排序的递归 C 程序给出意外输出
Recursive C program for sorting giving unexpected output
我正在尝试创建一个递归函数来对数组进行排序。这个想法是只要索引较小的元素较大就交换两个元素,因为我们想按升序排序。下面是我为此编写的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,并且外部循环将停止其迭代。
此外,在内部循环中,您必须为索引使用另一个变量,而不是 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
你在这里声明 int i
一次 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]);
//error for(i=1;i<n;i++)//this is your infinitive loop
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;
}
}
每次你进入这个循环
for(i=1;i<n;i++)
printf(",%d",a[i]);
你的 i
变成 1 然后在 loop 之后,它将变成 3 所以这会影响你的基本循环:(第一次之后)
for(i = 0;i<n-1,m==0;i++)
这里你的i
永远是4
所以这是一个不定式循环
看看这个
void swap(int array[], int index1, int index2) {
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
void sort(int array[], int startpoint, int arraylength) {
if (startpoint == arraylength - 1) return;
int minindex = startpoint;
for (int i = startpoint; i < arraylength; i++) if (array[i] < array[minindex]) minindex = i;
swap(array, startpoint, minindex);
sort(array, startpoint + 1, arraylength);
}
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,0, n);
}
return 0;
}
我正在尝试创建一个递归函数来对数组进行排序。这个想法是只要索引较小的元素较大就交换两个元素,因为我们想按升序排序。下面是我为此编写的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,并且外部循环将停止其迭代。
此外,在内部循环中,您必须为索引使用另一个变量,而不是 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
你在这里声明 int i
一次 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]);
//error for(i=1;i<n;i++)//this is your infinitive loop
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;
}
}
每次你进入这个循环
for(i=1;i<n;i++)
printf(",%d",a[i]);
你的 i
变成 1 然后在 loop 之后,它将变成 3 所以这会影响你的基本循环:(第一次之后)
for(i = 0;i<n-1,m==0;i++)
这里你的i
永远是4
所以这是一个不定式循环
看看这个
void swap(int array[], int index1, int index2) {
int temp = array[index1];
array[index1] = array[index2];
array[index2] = temp;
}
void sort(int array[], int startpoint, int arraylength) {
if (startpoint == arraylength - 1) return;
int minindex = startpoint;
for (int i = startpoint; i < arraylength; i++) if (array[i] < array[minindex]) minindex = i;
swap(array, startpoint, minindex);
sort(array, startpoint + 1, arraylength);
}
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,0, n);
}
return 0;
}