本文介绍:你可以从如下获得知识
1、归并排序(Merge-Sort)是利用归并的思想的排序算法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案修补在一起,即分而治之)
2、示意图
对治的最后一步分析一下:
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); } } /** * * @param arr 待排序的数组 * @param left 左边有序序列的初始索引 * @param mid 中间索引 * @param right 右边索引 * @param temp 中转数组 */ public static void merge(int[] arr,int left,int mid ,int right,int[] temp) { int i = left;//初始化i,左边的有序序列的初始化索引 int j = mid + 1;//初始化j,注意看我们第二张图,为什么要加1 int t = 0;//指向temp数组的当前索引 //(一) //先把左右两边(有序)的数据按照规则填充到temp数组, //直到两边的有序序列有一边处理完毕 while (i <= mid && j <= right) {//对右边的部分进行比较 //如果右边的有序序列的当前元素,小于等于右边的有序序列的当前元素 //则让他拷贝到数组零时数组temp里面去 //然后t++,或者j,i后移 if (arr[i] <= arr[j]) { temp[t] = arr[i]; t += 1; i += 1; } else {//反之就是右边的数据小于左边的数据,则将右边的当前数据拷贝到temp里面去 temp[t] = arr[j]; t += 1; j += 1; } } //(二) //把有剩余数据的一边依次填充全部填充到temp中去 while (i <= mid) {//i <= mid说明左边还有剩余数据 temp[t] = arr[i]; t += 1; i += 1; } while (j <= right) { temp[t] = arr[j]; t += 1; j += 1; } //(三) //将temp数据全部拷贝到arr里面 //注意并不是一次性拷贝,而是一次几个几个的拷贝, // 一次次的合并,一共要合并七次 // 最后一次才是才是tempLeft = 0;right = 7 t = 0; int tempLeft = left; while (tempLeft <= right) { arr[tempLeft] = temp[t]; t += 1; tempLeft += 1; } } }