学习产出:
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] arr = {8,4,5,7,1,3,6,2};
int[] temp = new int[arr.length];
mergeSort(arr, 0, arr.length-1, temp);
System.out.println("归并排序后: "+ Arrays.toString(arr));
}
//分 + 合的方法
public static void mergeSort(int[] arr, int left, int right, int[] temp){
if (left < right) {
int mid = (left + right) / 2; // 中间的索引
//向左递归进行分解
mergeSort(arr, left, mid, temp);
// 向右递归进行分解
mergeSort(arr, mid+1, right, temp);
// 以上是分解的方法
// 每次分解之后 合并一次
merge(arr, left, mid, right,temp);
}
}
public static void merge(int[] arr,int left,int mid,int right,int[] temp){
int i = left; //左边的有序序列的初始索引下标
int j = mid+1;//右边的有序序列的初始索引下标
int t = 0; //临时存储数据的temp数组的初始索引下标
//将左右两个序列进行对比,按照从小到打的顺序,依次存入temp数组中,知道有一个序列全部存入后停止。
while(i <= mid && j <= right){
if(arr[i]<=arr[j]){
temp[t] = arr[i];
t++;
i++;
}else {
temp[t] = arr[j];
t++;
j++;
}
}
//由于上面这一步,只存完了左右序列中的其中一个序列,剩下的数据我们还需要接着存入temp数组当中。
while(i<=mid){ //如果是左边序列没存完,就会执行下面这个循坏
temp[t] = arr[i];
t++;
i++;
}
while(j<=right){ //如果是右边序列没存完,就会执行下面这个循坏
temp[t] = arr[j];
t++;
j++;
}
//将temp数组的下标t重新置为0
t=0;
int tempLeft = left;// 第一次合并 tempLeft=0 right=1 // 第二次合并 tempLeft=2 right=3 // 第三次合并tempLeft=0 right=3
// 最后一次合并 tempLeft=0 right=7
while (tempLeft <= right){
arr[tempLeft++] = temp[t++];
}
}
}
思路:分治策略。
先将整个数组分开,再有序地合并。



