public class MergetSortTest01 {
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;
//这里有两个不同数组:第一个为被合并的数组(不同的位置上的数据),第二个为合并后的新数组
//1.将我们两个数组的数字进行比较,并且按照一定的顺序放入到我们的新的数组里面
while (i <= mid && j <= right) {
//2.将我们被合并的数组的i位置上的值和j位置上的值进行比较,谁小就放谁
if (arr[i] <= arr[j]) {
temp[t] = arr[i];
t++;
i++;
} else {
temp[t] = arr[j];
t++;
j++;
}
}
//3.上面的方式的补充部分
//左边的有序序列还有剩余的数字,填充到temp数组中
while (i <= mid) {
//不断的将元数组的index和临时数组的index后移,用于填充数值
temp[t] = arr[i];
t++;
i++;
}
//4.右边的有序序列还有剩余的数字,填充到temp数组中
while (j <= right) {
//不断的将元数组的index和临时数组的index后移,用于填充数值
temp[t] = arr[j];
t++;
j++;
}
//5.将(left~right的)temp数组的元素拷贝到arr中
t = 0;
int tempLeft = left;
while (tempLeft <= right) {
arr[tempLeft] = temp[t];
t += 1;
tempLeft += 1;
}
}
}