首页 > 解决方案 > 用于排序的递归 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),然后突然停止。

有人可以发现问题吗?

标签: csortingfor-looprecursionbubble-sort

解决方案


在 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 

推荐阅读