Почему я не получаю вывод для этой программы для пузырьковой сортировки массива с помощью рекурсии? - PullRequest
0 голосов
/ 10 марта 2019

Я пытался запустить процесс сортировки (n-1) раз и, следовательно, условия if else в основной функции. Поскольку мы должны использовать рекурсию, я использовал лестницу if else внутри пользовательской функции.

#include <stdio.h>

int bin (int a[]);

int n, i, a[100], j = 0, temp, count = 0;

int main ()
{
    printf ("enter the number of elements\n");
    scanf ("%d", &n);

    printf ("enter the array elements\n");
    for (i = 0; i < n; i++)
        scanf ("%d", &a[i]);

    bin (a);
    if (count == n - 1)
    {
        for (i = 0; i < n; i++)
        {
            printf ("%d", a[i]);
        }
        return 0;
    }
    else
    {
        j = 0;
        bin (a);
    }
}

int bin (int a[])
{
    if (j != n - 1 && a[j] > a[j + 1])
    {
        temp = a[j];
        a[j] = a[j + 1];
        a[j + 1] = temp;
        j++;
        bin (a);
    }
    else if (j != n - 1 && a[j] < a[j + 1])
    {
        j = j + 1;
        bin (a);
    }
    else
    {
        count++;
        return 0;
    }
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Рассмотрим ввод, как

4           // aka n
1 1 4 5     // the array elements

При первом вызове bin переменная j имеет значение 0, поэтому a[j] > a[j + 1] будет ложным (поскольку a[0] равно a[1]).Точно так же a[j] < a[j + 1] будет ложным.Таким образом, вы в итоге выполняете

else
{
    count++;
    return 0;
}

, т. Е. Код будет увеличиваться count так, что он станет равным 1, а затем функция вернется.быть ложным, поэтому вы закончите в этой части:

else
{
    j = 0;
    bin (a);
}

, где ничего не напечатано.Следовательно - нет вывода.

0 голосов
/ 10 марта 2019

В зависимости от количества элементов:

  • 1: (count == n - 1) ложно, поэтому вы не печатаете
  • 2: (count == n - 1) всегда верно, поэтому вы печатаете, ивы отсортировали массив
  • > 1: (count == n - 1) всегда ложно, поэтому вы не печатаете (чтобы убедиться, что я использовал брутальная сила для проверки)

Iтакже рекомендуем вам всегда проверять результат scanf , чтобы убедиться, что введено правильное значение.

Существует много способов сортировки с использованием (странно) рекурсии, один из которых может быть:

#include <stdio.h>
#include <stdlib.h>

int sort(int a[], int max)
{
  if (max == 0)
    return 0;

  int modified;

  if (a[0] > a[1]) {
    int v = a[0];

    a[0] = a[1];
    a[1] = v;
    modified = 1;
  }
  else
    modified = 0;

  return (sort(a + 1, max - 1) && sort(a, max - 1)) || modified;
}

int main ()
{
  int n, i;

  printf ("enter the number of elements\n");
  if ((scanf ("%d", &n) != 1) || (n <= 0))
    return -1;

  int * a = malloc(n * sizeof(int));

  if (a == NULL) {
    puts("not enough memory");
    return -1;
  }

  printf ("enter the array elements\n");
  for (i = 0; i < n; i++) {
    if (scanf ("%d", &a[i]) != 1) {
      puts("invalid value");
      return -1;
    }
  }

  sort(a, n - 1);

  for (i = 0; i < n; i++)
    printf ("%d ", a[i]);
  putchar('\n');

  free(a);

  return 0;
}

Компиляция и выполнение:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra b.c
pi@raspberrypi:/tmp $ ./a.out
enter the number of elements
1
enter the array elements
1
1 
pi@raspberrypi:/tmp $ ./a.out
enter the number of elements
2
enter the array elements
1 2
1 2 
pi@raspberrypi:/tmp $ ./a.out
enter the number of elements
2
enter the array elements
2 1
1 2 
pi@raspberrypi:/tmp $ ./a.out
enter the number of elements
4
enter the array elements
4 3 2 1
1 2 3 4 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...