Как правильно реализовать пузырьковую сортировку рекурсивно?

Я пишу метод для реализации пузырьковой сортировки с рекурсией, и мой базовый случай — «длина массива», в этом случае мне нужно рекурсивно вызывать функцию от «0» до array.length-1, однако, когда я прошел через коды от других людей, я нашел их все, используя базовый случай «1», и это запускает рекурсию от array.length к «1». Я знаю, что обе наши рекурсии выполняются одинаковое количество раз и получают один и тот же результат, но я просто немного смущен, значит ли это, что мое понимание рекурсии неверно?

мой код:

  public static void bubbleRecursion(int arr[],int n){
    if (n==arr.length){
        System.out.println(Arrays.toString(arr));
        return;
     }
    for (int i = 0;i<arr.length-1-n;i++){
      if (arr[i]>arr[i+1]){
        int temp;
        temp = arr[i];
        arr[i] = arr[i+1];
        arr[i+1] = temp;
       }
     }
     bubbleRecursion(arr, n+1);
  }

bubbleRecursion(array,0);

чужой код:

public static void sortingRecursion(int[] arr, int n){
  if (n == 1){
     return;
  }
  for (int i = 0;i < n-1;i++){
      if (arr[i]>arr[i+1]){
        int temp;
        temp = arr[i];
        arr[i] = arr[i+1];
        arr[i+1] = temp;
       }
   }
   sortingRecursion(arr, n-1);
}


sortingRecursion(array, array.length);

Затем я посмотрел определение рекурсии, кажется, что ввод должен становиться все меньше и меньше каждый раз, но мой код каждый раз увеличивает значение n, так что теперь я немного запутался, означает ли это, что мой код является неправильный ответ, хотя вывод правильный?

Кто-нибудь может мне помочь? Спасибо

Если у вас есть массив/список размера 1, он уже отсортирован. Пустой массив/список тоже сортируется, но уже можно остановиться на 1; он не становится «более упорядоченным».

knittl 27.11.2022 11:21

Почему if (n == 1) return; вместо if (n == 0) return;?

Maxwell D. Dorliea 27.11.2022 11:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваш базовый случай должен быть if (n == 0) return;

Решение

public static void sortingRecursion(int[] arr, int n){
  if (n == 0){
     return;
  }
  for (int i = 0;i < n;i++){
      if (arr[i]>arr[i+1]){
        int temp;
        temp = arr[i];
        arr[i] = arr[i+1];
        arr[i+1] = temp;
       }
   }
   sortingRecursion(arr, n-1);
}

Применение

int array[] = {5, 4, 7, 2, 8};
sortingRecursion(array, array.length - 1);
System.out.println(Arrays.toString(array));

Выход

[2, 4, 5, 7, 8]

Отредактировано

Базовый вариант 1 тоже работает. Массив с одним элементом (например, [42]) уже отсортирован правильно.

knittl 27.11.2022 11:45
Ответ принят как подходящий

ввод должен становиться все меньше и меньше каждый раз, но мой код каждый раз увеличивает значение n

Это правда, но поскольку вы используете n иначе, чем в другой версии, вы все равно каждый раз уменьшаете ввод: условие цикла срабатывает раньше при каждой следующей рекурсии, поскольку array.length - 1 - n становится меньше. Так что не беспокойтесь, ваша версия также уменьшает проблему на каждом рекурсивном шаге.

просматривая коды от других людей, я обнаружил, что все они используют базовый регистр "1"

Это имеет смысл, так как в этом случае условие цикла будет ложным: i < n - 1 будет ложным, когда n равно 1.

Вы можете сделать то же самое в своей версии, изменив базовый тест на if (n==array.length-1).

Однако это не означает, что ваш текущий базовый тест ужасно неверен. Это просто означает, что когда n равно array.length-1, цикл все равно будет выполняться, но не будет повторяться, потому что условие цикла сразу становится ложным. И тогда следующий рекурсивный вызов все равно попадет в базовый случай. Так что это просто означает, что есть еще один рекурсивный вызов, который ничего не делает.

Другие вопросы по теме