归并算法是O(n log n)级别的算法。空间上需要开辟一个与其同样大的数组。
其思想是分治法。
分治思想,将数组,分为一半,再细分一半......一半。将数组分成几部分排序,
最后是两个元素之间的比较。
arr [ left++ ] 与 arr [ mid++ ]两个索引在大小之间一较高下,谁大,谁先排序。
public class MergeSort {
private static void Merge(int []arr, int l,int mid,int r){
int i = l;
int j = mid+1;
int[] temp = Arrays.copyOfRange(arr,l,r+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] < temp[j-l]){//左半边元素<右半边元素
arr[k] = temp[i-l];
i++;
}else{//左半边元素>右半边元素
arr[k] = temp[j-l];
j++;
}
}
}
private static void sort(int[] 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 void sort(int[] arr){
int n = arr.length;
sort(arr,0,n-1);
}