具体看代码!有注解!
笔记!
public class MergeSort {
static void mergeSort(int[] arr,int n){
Totle_mergeSort(arr, 0 ,n-1);
}
static void Totle_mergeSort(int[] arr,int l,int r){
if ( l>=r ) {//说明只有一个元素,出递归
return;
}
//l+r可能发生溢出错误
int mid = (l+r)/2;//把数组一分为二
Totle_mergeSort(arr,l,mid);//对左半部分递归排序
Totle_mergeSort(arr,mid+1,r);//对右半部分递归排序
merge(arr,l,mid,r);//把排序完成的两部分归并
}
static void merge(int[] arr,int l,int mid,int r){
int[] aux = new int[r-l+1];
for (int i = l; i < r; i++) {
aux[i-l] = arr[i];
}
int i = l, j = mid + 1;
for (int k = l; k < r; k++) {
/**如果i > mid,说明i已经到了左半部分的尽头,(左半部分的尽头是mid),
* 所以,不用再管左半部分,
* 只需要把右半部分剩下的元素添加进来就好了,
* 所以我们只处理j就好了;
* */
if(i > mid){
arr[k] = aux[j-l];
j++;
}
/**
* 如果j > r,说明j已经到了右半部分的尽头,(右半部分的尽头是r),
* 所以,不用再管右半部分,
* 只需要把左半部分剩下的元素添加进来就好了,
* 所以我们只处理i就好了;
*/
else if (j > r) {
arr[k] = aux[i-l];
i++;
}
else if (aux[i-l] < aux[j-l]) {
arr[k] = aux[i-l];
}
else{
arr[k] = aux[j-l];
j++;
}
}
}
public static void main(String[] args) {
int[] arr = new int[1000];
mergeSort(arr,arr.length);
}
}