需求:将数组中元素排序
思路:将数组拆分成若干一个元素的小数组,数组两两合并,
与之前的排序方法不同在于,归并排序,需要额外的空间,用来临时存放合并后的小数组
public static void MergeSort(int[] arr, int first, int last) {
System.out.println("MergeSort"+first+last);
int mid = 0;
if (last - first > 1) {
mid = (last + first) / 2;
MergeSort(arr, first, mid);//排序中认为最右端不可达,所以,mid不能+1;
MergeSort(arr, mid , last);
Merge(arr, first, mid, last);
}
}
private static void Merge(int[] arr, int first, int mid, int last) {
System.out.println("Merge"+first+mid+last);
int[] arr1 = new int[last - first + 1];
int i = first;
int j = mid;
int n = 0;
while (i < mid && j < last) {
if (arr[i] <= arr[j]) {
arr1[n] = arr[i];
i++;
n++;
} else {
arr1[n] = arr[j];
j++;
n++;
}
}
while (i < mid) {
arr1[n] = arr[i];
i++;
n++;
}
while (j < last) {
arr1[n] = arr[j];
j++;
n++;
}
int a = 0;
for (int x = first; x <last; x++) {
arr[x] = arr1[a++];
}
arr1 = null;
}
这个其实不难理解,就是顺着一支向下拆,拆到最下边向上合并,合并完这一支的元素,继续拆下一支(计算机做的顺序)
过程如图,以数组下标0-7为例,黑色为拆分过程,黄色为合并过程,框中数字为矩阵下标,线上数字为处理顺序
时间复杂度:O(nlogn)
空间复杂度:O(n)