Сортировка слиянием в Java: рекурсивный и итеративный подходы

Чтобы выполнить сортировку массива слиянием в Java, вы можете использовать следующие методы:

Метод 1: рекурсивный подход

public static void mergeSort(int[] arr) {
    if (arr.length <= 1) {
        return;
    }
    int mid = arr.length / 2;
    int[] left = new int[mid];
    int[] right = new int[arr.length - mid];
    System.arraycopy(arr, 0, left, 0, left.length);
    System.arraycopy(arr, mid, right, 0, right.length);
    mergeSort(left);
    mergeSort(right);
    merge(arr, left, right);
}
public static void merge(int[] arr, int[] left, int[] right) {
    int i = 0, j = 0, k = 0;
    while (i < left.length && j < right.length) {
        if (left[i] <= right[j]) {
            arr[k++] = left[i++];
        } else {
            arr[k++] = right[j++];
        }
    }
    while (i < left.length) {
        arr[k++] = left[i++];
    }
    while (j < right.length) {
        arr[k++] = right[j++];
    }
}

Метод 2: итеративный подход

public static void mergeSortIterative(int[] arr) {
    if (arr.length <= 1) {
        return;
    }
    int n = arr.length;
    for (int currSize = 1; currSize < n; currSize *= 2) {
        for (int leftStart = 0; leftStart < n - 1; leftStart += 2 * currSize) {
            int mid = Math.min(leftStart + currSize - 1, n - 1);
            int rightEnd = Math.min(leftStart + 2 * currSize - 1, n - 1);
            merge(arr, leftStart, mid, rightEnd);
        }
    }
}
public static void merge(int[] arr, int left, int mid, int right) {
    int[] temp = new int[right - left + 1];
    int i = left, j = mid + 1, k = 0;
    while (i <= mid && j <= right) {
        if (arr[i] <= arr[j]) {
            temp[k++] = arr[i++];
        } else {
            temp[k++] = arr[j++];
        }
    }
    while (i <= mid) {
        temp[k++] = arr[i++];
    }
    while (j <= right) {
        temp[k++] = arr[j++];
    }
    System.arraycopy(temp, 0, arr, left, temp.length);
}

Чтобы выполнить сортировку массива слиянием в Java, вы можете использовать либо рекурсивный, либо итеративный подход. Рекурсивный подход делит массив на половины до тех пор, пока каждый подмассив не будет содержать только один элемент, а затем объединяет их обратно в отсортированном порядке. Итеративный подход выполняет итерацию по массиву, объединяя подмассивы увеличивающегося размера, пока не будет отсортирован весь массив.