4 апреля 2021
Тэги: Java, Kotlin, алгоритмы.
Среди других алгоритмов сортировки «пузырьковая» является самой медленной. Однако при этом алгоритм достаточно прост для понимания. На практике вместо него используют другие алгоритмы сортировки. Про пузырьковую сортировку любят рассказывать при обучении программированию и любят спрашивать на собеседованиях.
Суть алгоритма заключается в том, что мы последовательно проходимся по массиву элементов, сравнивая текущий и предыдущий между собой. Если предыдущий больше текущего, то меняем их местами. Таким образом, элемент с наибольшим значением как бы «всплывает» в конец массива. Отсюда и название «пузырьковая сортировка».
На первой итерации в конце оказался наибольший элемент, однако надо отсортировать и другие. Поэтому возвращаемся в начало и начинаем новую итерацию. То есть мы проходимся по массиву много раз. Отсюда сложность алгоритма O(N^2), т.е. количество операций примерно равно количеству элементов массива в квадрате.
Рассмотрим реализацию этого алгоритма сначала на Kotlin, а затем и на Java.
Для начала инициализируем исходный массив целых чисел с помощью метода intArrayOf().
Преобразование массива в список делаем исключительно для того, чтобы метод println() корректно отобразил содержимое массива.
Сам метод bubbleSort() сделаем как метод расширения класса IntArray:
Заводим специальный флажок sorted, который является признаком того, что сортировка завершена. Затем запускаем цикл while, который на каждой итерации будет проверять состояние этого флажка. То есть цикл выполняется до тех пор, пока массив полностью не отсортирован.
Внутри этого цикла делаем ещё один цикл:
Перед началом вложенного цикла устанавливаем наш флаг в значение true. Затем проходимся по всем элементам, начиная со второго и до конца. На каждой итерации вложенного цикла берём текущий и предыдущий элемент и сравниваем их между собой. Если предыдущий больше текущего, то меняем их местами с помощью вспомогательного метода swap(). После обмена устанавливаем флаг sorted в false, чтобы внешний цикл затем пошёл ещё на одну итерацию.
Реализация вспомогательного метода swap() довольно проста. Он также выполнен как метод расширения класса IntArray:
Теперь запустим нашу программу и увидим состояние массива до сортировки и после:
Как видите, исходный массив был полностью отсортирован.
Теперь приведу полностью аналогичную реализацию алгоритма на Java 11. Метод main():
Метод с пузырьковой сортировкой:
Метод обмена значений:
Как видите, тут уже никаких методов расширения, поэтому приходится передавать в методы на один параметр больше. В остальном всё то же самое, только объём кода чуть больше.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.