package com.dai.sort; import java.util.Arrays; public class MergeSort { public static void main(String[] args) { // TODO Auto-generated method stub 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); } } //合并的方法 /* * arr 原始数组 * left 左边有序数列的索引 * mid中间索引 * right右边索引 * temp 中转数组 * */ public static void merge(int[] arr, int left, int mid, int right, int[] temp) { int i = left; //吃书初始化i,左边有序数列的初始索引 int j = mid + 1; //初始化j,右边有序数列的初始索引 int t = 0; //指向temp数组的当前索引 //先把左右两边的数据按照规则填充到temp,直到左右两边的有序序列有一边处理完毕为止 while (i <= mid && j <= right) { if(arr[i] <= arr[j]) { temp[t] = arr[i]; t += 1; i += 1; } else { temp[t] = arr[j]; t += 1; j += 1; } } //把有剩余数据的一边的数据一次全部填充到temp while(i <= mid) {//左边有序序列还有剩余的,全部填充到temp temp[t] = arr[i]; t += 1; i += 1; } while(j <= right) { //右边有序……还有剩余,…… temp[t] = arr[j]; t += 1; j += 1; } //将temp数组重新拷贝到arr,并不是每次都拷贝所有 t = 0; int tempLeft = left; while(tempLeft <= right) { arr[tempLeft] = temp[t]; t += 1; tempLeft += 1; } } }