Java сортировка слиянием: простое и удобное решение
Сортировка слиянием (Merge Sort) - это один из самых популярных алгоритмов сортировки в Java. Этот алгоритм принадлежит к так называемым "дивизионным" сортировкам, поскольку сортирует массив путем разбиения его на две половины и рекурсивного слияния уже отсортированных подмассивов.
Основной алгоритм сортировки слиянием можно реализовать следующим образом:
1. Разделить исходный массив пополам, используя индекс середины.
2. Рекурсивно вызвать функцию сортировки слиянием для каждой половины массива.
3. Объединить отсортированные половины массива в один упорядоченный массив.
Процесс слияния двух отсортированных массивов заключается в следующих действиях:
1. Создать новый массив, в котором будут храниться элементы двух отсортированных массивов.
2. Сравнить первый элемент каждого массива и добавлять в новый массив наименьший из них.
3. Повторять шаг 2 для оставшихся элементов обоих массивов.
4. Если один из массивов кончается, то оставшиеся элементы добавляем в конец нового массива.
Ниже приведен пример кода реализации сортировки слиянием на языке программирования Java:
public class MergeSort {
public static void main(String[] args) {
int[] arr = { 5, 2, 7, 1, 9, 3 };
mergeSort(arr, 0, arr.length - 1);
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int middle = (left + right) / 2;
mergeSort(arr, left, middle);
mergeSort(arr, middle + 1, right);
merge(arr, left, middle, right);
}
}
public static void merge(int[] arr, int left, int middle, int right) {
int n1 = middle - left + 1;
int n2 = right - middle;
int[] leftArr = new int[n1];
int[] rightArr = new int[n2];
for (int i = 0; i < n1; i++) {
leftArr[i] = arr[left + i];
}
for (int j = 0; j < n2; j++) {
rightArr[j] = arr[middle + 1 + j];
}
int i = 0, j = 0, k = left;
while (i < n1 && j < n2) {
if (leftArr[i] <= rightArr[j]) {
arr[k] = leftArr[i];
i++;
} else {
arr[k] = rightArr[j];
j++;
}
k++;
}
while (i < n1) {
arr[k] = leftArr[i];
i++;
k++;
}
while (j < n2) {
arr[k] = rightArr[j];
j++;
k++;
}
}
}
В данном примере функция `mergeSort` рекурсивно вызывает себя для каждой половины массива, а затем вызывает функцию `merge`, чтобы объединить отсортированные подмассивы. Функция `merge` сливает два отсортированных подмассива в один упорядоченный массив.
При сортировке слиянием создается дополнительный массив той же длины, что и исходный массив. Использование дополнительной памяти может быть недопустимо при работе с очень большими массивами. Однако, сортировка слиянием имеет оптимальную асимптотическую сложность O(n log n) и применяется в практике программирования для сортировки массивов среднего и крупного размера.