Почему эта ошибка сортировки возникает только в случаях >5 элементов таблицы?

#java #sorting

Вопрос:

пожалуйста, ознакомьтесь с моим кодом для сортировки пузырьков. Когда я выбираю 5 или более чисел для сортировки моей таблицы, я получаю ошибку: сначала.сначала.сортировка_v2.сортировка(сортировка_v2.java:35).

Совершенно не знаю, почему это произошло, когда я выбираю 2 или три элемента для сортировки, это работает идеально. Я знаю, что это можно сделать по-другому, этот тип сортировки, но, пожалуйста, покажите мне, что я сделал не так, как все еще учусь, и мне очень любопытно узнать подробности этой ошибки, хм.

Также смотрите изображение ниже:введите описание изображения здесь

     public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Choose how much number you want to sort:");
        int sizeOfTab = scanner.nextInt();
        int[] numbers = new int[sizeOfTab];

        for (int i = 0; i < sizeOfTab; i  ) {
            System.out.println("Choose number to collection: ");
            numbers[i] = scanner.nextInt();
        }
        scanner.close();
        System.out.println(Arrays.toString(sorting(numbers)));
    }

    private static int[] sorting(int[] numbers) {
        boolean notDone = false;
        for (int i = 0; i < numbers.length - 1; i  ) {
            for (int j = 1; j < numbers.length; j  ) {
                if (numbers[i] > numbers[j]) {
                    int tmp = numbers[j];
                    numbers[j] = numbers[i];
                    numbers[i] = tmp;
                    notDone = true;
                }

            }

        }
        return notDone ? sorting(numbers) : numbers;
    }
}
 

Ответ №1:

Ваша логическая ошибка заключается в том, что вы всегда перезапускаете свой второй внутренний цикл из j = 1 второго элемента в

 for (int j = 1; j < numbers.length; j  ) { ... }
 

Вы всегда хотите сравнивать только numbers[i] > numbers[j] в тех случаях, когда j больше, чем i .

Допустим, у вас есть массив [1, 2, 3, 4]

В настоящее время ваш цикл будет запущен и достигнет точки, где он проверит numbers[2] > numbers[1] и переключит второй и третий элемент, несмотря на то, что массив уже отсортирован.

Чтобы исправить это, просто всегда начинайте свой второй цикл с текущего значения i с добавлением 1:

  for (int j = i 1; j < numbers.length; j  ) { ... }