Алгоритмы сортировки
Сортировка пузырьком
Алгоритм просматривает массив и сравнивает каждую пару соседних элементов. Когда он встречает пару элементов, расположенных не по порядку, происходит замена двух элементов местами.
Шаги для сортировки массива чисел от наименьшего к большему:
4 2 1 5 3: два первых элемента расположены в массиве в неверном порядке. Меняем их.
2 4 1 5 3: вторая пара элементов тоже «не в порядке». Меняем и их.
2 1 4 5 3: а эти два элемента в верном порядке (4 < 5), поэтому оставляем как есть.
2 1 4 5 3: очередная замена.
2 1 4 3 5: результат после одной итерации.
1 | public static void bubbleSort(int[] array) { |
Временная сложность O(n ^ 2).
Быстрая сортировка
Выбирает один элемент массива в качестве стержня и сортирует остальные элементы вокруг (меньшие элементы налево, большие направо).
1 | static int partition(int[] array, int begin, int end) { |
Временная сложность O(n^2).
Преимущества - у алгоритма очень хорошее среднее время запуска, также равное O(nlog n), он эффективен для больших потоков ввода. Алгоритм не занимает дополнительного пространства, вся сортировка происходит «на месте», отсутствуют затратные вызовы распределения, из-за чего его часто предпочитают сортировке слиянием.
Сортировка вставками
Этот алгоритм разделяет оригинальный массив на сортированный и несортированный подмассивы.
Длина сортированной части равна 1 в начале и соответствует первому (левому) элементу в массиве. После этого остается итерировать массив и расширять отсортированную часть массива одним элементом с каждой новой итерацией.
После расширения новый элемент помещается на свое место в отсортированном подмассиве. Это происходит путём сдвига всех элементов вправо, пока не встретится элемент, который не нужно двигать.
3 5 7 8 4 2 1 9 6: выбираем 4 и помним, что это элемент, который нужно вставить. 8 > 4, поэтому сдвигаем.
3 5 7 x 8 2 1 9 6: здесь x – нерешающее значение, так как элемент будет перезаписан (на 4, если это подходящее место, или на 7, если смещение). 7 > 4, поэтому сдвигаемся.
3 5 x 7 8 2 1 9 6
3 x 5 7 8 2 1 9 6
3 4 5 7 8 2 1 9 6
1 | public static void insertionSort(int[] array) { |
Временная сложность O(n ^ 2).
Сортировка выбором
Сортировка выбором тоже разделяет массив на сортированный и несортированный подмассивы. Но на этот раз сортированный подмассив формируется вставкой минимального элемента не отсортированного подмассива в конец сортированного, заменой.
3 5 1 2 4
1 5 3 2 4
1 2 3 5 4
1 2 3 5 4
1 2 3 4 5
1 2 3 4 5
1 | public static void selectionSort(int[] array) { |
Временная сложность O(n^2).
Сортировка слиянием
Массив делится на два подмассива, а затем происходит:
- Сортировка левой половины массива (рекурсивно)
- Сортировка правой половины массива (рекурсивно)
- Слияние
1 | public static void mergeSort(int[] array, int left, int right) { |
Временная сложность O(nlog n)
Пирамидальная сортировка
Пирамида или двоичная куча – это дерево, в котором каждый узел состоит в отношениях с дочерними узлами. Добавление нового узла начинается с левой позиции нижнего неполного уровня.
1 | static void heapify(int[] array, int length, int i) { |