1、算法思想:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
第四步:重复第三步, 直到某一指针达到序列尾
第五步:将另一序列剩下的所有元素直接复制到合并序列尾
2、动图演示(动图来源菜鸟教程)
代码实现:
public class MergeSort {
public static void main(String[] args) {
int[] arr = {22, 34, 3, 32, 82, 55, 89, 50, 37, 5, 64, 35, 9, 70};
int[] ans = sort(arr);
for(int i : ans) {
System.out.print(i + " ");
}
}
private static int[] sort(int[] arr) {
if(arr.length < 2) {
return arr;
}
int mid = arr.length / 2;
int[] left = Arrays.copyOfRange(arr, 0, mid);
int[] right = Arrays.copyOfRange(arr, mid, arr.length);
return mergeSort(sort(left), sort(right));
}
private static int[] mergeSort(int[] left, int[] right) {
int[] ans = new int[left.length + right.length];
int x = 0;
while(left.length > 0 && right.length > 0) {
if(left[0] < right[0]) {
ans[x++] = left[0];
left = Arrays.copyOfRange(left,1,left.length);
}else {
ans[x++] = right[0];
right = Arrays.copyOfRange(right,1,right.length);
}
}
while(left.length > 0){
ans[x++] = left[0];
left = Arrays.copyOfRange(left,1,left.length);
}
while(right.length > 0) {
ans[x++] = right[0];
right = Arrays.copyOfRange(right,1,right.length);
}
return ans;
}
}
运行结果:3 5 9 22 32 34 35 37 50 55 64 70 82 89