Рекурсивная C программа для сортировки, дающая неожиданный вывод - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь сделать рекурсивную функцию для сортировки массива. Идея состоит в том, чтобы поменять местами два элемента всякий раз, когда элемент с меньшим индексом больше, потому что мы хотим отсортировать по возрастанию. Ниже приведена программа на 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;
}

Эта программа не дает желаемого результата, она работает очень долго l oop (даже для n = 4), а затем внезапно останавливается.

Может кто-нибудь, пожалуйста, обнаружите проблему ??

Ответы [ 2 ]

1 голос
/ 18 марта 2020

вы объявляете int i один раз здесь int m = 0,i,temp;, затем используйте его для каждого l oop

взгляда:

    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;
            }
        }

каждый раз, когда вы вводите этот l oop

for(i=1;i<n;i++)
            printf(",%d",a[i]);

ваш i станет 1, а затем после l oop будет 3, и это повлияет на вашу базу l oop :( после первого раза)

for(i = 0;i<n-1,m==0;i++)

ваш i здесь всегда будет 4, так что это инфинитив l oop

посмотрите на это

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;
}
1 голос
/ 18 марта 2020

В условии оператора 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;
    //...

То есть, если во внутреннем l oop не было замена элементов массива означает, что массив уже отсортирован, тогда m будет равно 0, а внешний l oop остановит свои итерации.

Также в сочетании с внутренним l oop вы должны использовать другая переменная для индекса не 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 
...