简单版本

两个已经排序好的数组,

1,3,5,7,8,9......
2,4,5,7,10......

显而易见,用两个指针m、n,分别指向两个数组的开头

  • 比较m、n大小
  • 小的指针所在点放入新数组,并将该指针向后移动一位
  • 重复比较,移动
  • 最后有一个指针到了尽头,将另外的指针剩余部分放入新数组尾部

这样就完成了排序。

有序?不存在的

如果只有一个数组,而且是无序的,想要使用归并排序,怎么办?

  • 按长度分成2个数组,是有序的话,就归并
  • 不是有序的,分成4个数组,是有序的话,就归并
  • 还不是有序的,一直分成有序的为止,此时每个数组长度为1
  • 然后归并

代码

static void sort(int[] array) {
    for (int i = 1; i < array.length / 2; i *= 2) {
        int step = i * 2;
        for (int j = 0; j + step <= array.length; j += step) {
            merge(array, j, i, i);
        }
        final int left = array.length % (i * 2);
        if (left > 0) {
            merge(array, array.length - step - left, step, left);
        }
    }
}
static void merge(int[] array, int index, int ll, int rl) {
    int m = index;
    int n = index + ll;
    while (m < n && n < index + ll + rl) {
        if (array[m] > array[n]) {
            move(array, n, m);//insert n before m
            n++;
        }
        m++;
    }
}
static void move(int[] array, int from, int to) {
    int temp = array[from];
    int p = to;
    while (p <= from) {
        array[from] = array[p]; //临时保存当前值
        array[p] = temp; //当前值设置为上一个temp的值
        temp = array[from]; //保存当前值
        p++;
    }
}