/**
* 归并排序
* 个人理解:1.分治法思想(将复杂问题分成多个相同或相似的独立问题,递归解决后合并)
* 2.时间复杂度,二分拆解,所以最好最坏都是O(nlogn)
* 3.空间复杂度,使用到临时数组,所以是O(n)
* 4.稳定性,相邻元素比较,稳定
*/
public class MergeSort {
public static void main(String[] args) {
int[] arr = {70, 12, 82, 43, 99, 23, 38, 53, 22}
mergeSort(arr, 0, arr.length-1)
Arrays.stream(arr).forEach(a->System.out.print(a+" "))
}
public static void mergeSort(int[] arr, int start, int end) {
if (start >= end) {
return
}
int mid = (start + end)/2
//分解
mergeSort(arr, start, mid)
mergeSort(arr, mid+1, end)
//二路归并
merge(arr, start, mid, end)
}
private static void merge(int[] arr, int start, int mid, int end) {
int s1 = start
int s2 = mid+1
int e1 = mid
int e2 = end
int[] tmp = new int[end-start+1]
int k = 0
while (s1 <= e1 && s2 <= e2) {
if (arr[s1] < arr[s2]) {
tmp[k++] = arr[s1++]
} else {
tmp[k++] = arr[s2++]
}
}
while (s1 <= e1) tmp[k++] = arr[s1++]
while (s2 <= e2) tmp[k++] = arr[s2++]
for (int i=0
arr[start+i] = tmp[i]
}
}
}