归并排序

毕业人士的时间大部分花在工作上, 对学生时代的算法训练就逐渐忘记了。但对基本的算法还是应该知道的。

归并排序的思路(分而治之):

  1. 划分问题:将数组分为数量相等的两半
  2. 递归求解:把两半元素分别排序
  3. 合并问题:将两个有序子数组合并成一个
public class MergeSort {

    public void mergeSort(int[] A, final int i, final int j, int[] B) {
        if (i >= j) {
            // 递归边界:此时数组中只有一个元素,无须排序
            return;
        }
        int m = i + (j - i) / 2;
        mergeSort(A, i, m, B);
        mergeSort(A, m + 1, j, B);
        int x = i;
        int y = m + 1;
        int index = i;
        while (x <= m || y <= j) {
            if (x > m || (y <= j && A[y] <= A[x])) {
                B[index++] = A[y++];
            } else {
                B[index++] = A[x++];
            }
        }
        // 忘记的代码
        for (int k = i; k <= j; k++) {
            A[k] = B[k];
        }
    }

    public static void main(String[] args) {
        int len = 20;
        int[] A = new int[len];
        int[] B = new int[len];
        for (int i = 0; i < len; i++) {
            A[i] = ThreadLocalRandom.current().nextInt(100);
        }
        System.out.println(Arrays.toString(A));
        MergeSort sort = new MergeSort();
        sort.mergeSort(A, 0, len - 1, B);
        System.out.println(Arrays.toString(A));
        System.out.println(Arrays.toString(B));
    }
}

一开始没看书,自己写,忽略了有注释的代码。B作为辅助空间,只是为了第三部归并的时候使用。

参考资料:《算法竞赛入门经典》

你可能感兴趣的:(归并排序)