算法-归并排序

对两个有序数组进行排序:

将arr数组中,左右两个有序数组分别复制到两个数组中,逐个比较,再放到原数组中,这样原数组有序。(或者利用双指针遍历,复制到一个新的数组中)

代码:

public void merge(int[] arr, int L, int R, int M) {
        int leftSize = M - L;
        int rightSize = R - M + 1;

        int[] left = new int[leftSize];
        int[] right = new int[rightSize];

        for (int i = L; i < M; ++i)
            left[i-L] = arr[i];
        for (int j = M; j <= R; ++j)    // j<=R 需要注意
            right[j-M] = arr[j];

        int i = 0, j = 0, k = L;    // k=L 需要注意,不是0
        while (i < leftSize && j < rightSize) {
            if (left[i] < right[j])
                arr[k++] = left[i++];
            else
                arr[k++] = right[j++];
        }

        while (i < leftSize)
            arr[k++] = left[i++];
        while (j < rightSize)
            arr[k++] = right[j++];
    }

对一组乱序数组进行排序:
递归,使数组的左右两个子数组有序,直至递归到左右两个数组都只有一个元素,然后再执行上面的merge操作。

代码:

public void mergeSort(int[] arr, int L, int R) {
        if (L == R)
            return;
        else {
            int M = (L + R) / 2;
            mergeSort(arr, L, M);
            mergeSort(arr, M + 1, R);
            merge(arr, L, R, M + 1);
        }
    }

完整代码:

public class MergeSort {

    /**
     * 对两个有序的数组进行排序
     * @param arr 排序的数组,L~M,M+1~R 之间是有序的
     */
    public void merge(int[] arr, int L, int R, int M) {
        int leftSize = M - L;
        int rightSize = R - M + 1;

        int[] left = new int[leftSize];
        int[] right = new int[rightSize];

        for (int i = L; i < M; ++i)
            left[i-L] = arr[i];
        for (int j = M; j <= R; ++j)    // j<=R 需要注意
            right[j-M] = arr[j];

        int i = 0, j = 0, k = L;    // k=L 需要注意,不是0
        while (i < leftSize && j < rightSize) {
            if (left[i] < right[j])
                arr[k++] = left[i++];
            else
                arr[k++] = right[j++];
        }

        while (i < leftSize)
            arr[k++] = left[i++];
        while (j < rightSize)
            arr[k++] = right[j++];
    }

    public void mergeSort(int[] arr, int L, int R) {
        if (L == R)
            return;
        else {
            int M = (L + R) / 2;
            mergeSort(arr, L, M);
            mergeSort(arr, M + 1, R);
            merge(arr, L, R, M + 1);
        }
    }


    public static void main(String[] args) {
        int[] arr = {6, 3, 2, 7, 5, 1, 4, 0, 8, 9};

        MergeSort sort = new MergeSort();
        sort.mergeSort(arr, 0, arr.length-1);

        System.out.println(Arrays.toString(arr));
    }
}
posted @ 2020-06-30 01:28  吹不散的流云  阅读(110)  评论(0编辑  收藏  举报