基本思想
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-feZ2bhuI-1610469446633)(199870C6B84A4C519FF8BE51F2A9D9E0)]
复杂度 O(nlogn)
核心问题:如何进行归并
- 比较A[0] 和 B[0]哪个小,取出小的元素,继续比较
【实现】
public class MergeSort<E>{
private MergeSort(){}
public static <E extends Comparable<E>>void sort(E[] arr){
sort(arr,0, arr.length-1);
}
public static <E extends Comparable<E>>void sort(E[] arr,int l,int r){
//最基本问题
if(l >= r){
return;
}
//获取中间值
int mid = (l + r) / 2;
//分开进行排序
sort(arr,l,mid);
sort(arr,mid+1,r);
//对排好序的数组进行归并
merge(arr,l,mid,r);
}
//实现归并
public static <E extends Comparable<E>>void merge(E[] arr,int l,int mid,int r){
E[] temp = Arrays.copyOfRange(arr,l,r + 1);
int i = l,j = mid + 1;
for (int k = l; k <= r;k++) {
//先考虑越界的情况
if(i > mid){
arr[k] = temp[j-l];
j++;
}else if(j > r){
arr[k] = temp[i-l];
i++;
}else if(temp[i-l].compareTo(temp[j-l]) <= 0){
arr[k] = temp[i-l];
i++;
}else{
arr[k] = temp[j-l];
j++;
}
}
}
}