用于排序的递归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 elementsn");
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 %dn",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,然后在循环之后,它将变成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 elementsn");
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 %dn", i + 1);
scanf("%d", &a[i]);
}
sort(a,0, n);
}
return 0;
}

最新更新