归并排序图解:
代码实现:
package com.cai.math; import java.util.Arrays; public class MergerSort { public static void main(String[] args) { int[] arr = {14,12,15,13,11,16}; sort(arr,0,arr.length-1); System.out.println(Arrays.toString(arr)); } public static void sort(int[] arr,int low,int high){ //每次数组长度/2,分成左右两组,直到分割完,然后再归并 if(low<high){ int mid = (low+high)/2; sort(arr, low, mid); sort(arr,mid+1,high); merger(arr, low, high); } } /** * 数组 归并 如最后一次:{12,14,15} {11,13,16}==》{11,12,13,14,15,16} * 所以这里 low->0 high->5 * @param arr * @param low 低位下角标 * @param high 高位下角标 */ public static void merger(int[] arr,int low,int high){ //1.分别给出两个指针(对应前后的下角标位置) int i = low; //(0-->2) int mid = (low+high)/2;//2 int j = mid+1; //(3-->5) //2.定义一个临时数组,暂时存放对应位置的数据,为之后数组写回对应的数据:这里直接给出需要排序数组的长度 int[] temp = new int[arr.length]; int k = low; //临时数组此时指针(为了不考虑其它,这里就对应参数数组对应开始的下角标) //3.迭代,直到前一组或后一组的数据全部取出 while(i<=mid && j<= high){ //如果 i 指针所对应的数 小于 j对应的数 把i对应的数写入临时数组 i++ if(arr[i]<arr[j]){ temp[k++] = arr[i++]; }else{ //反之,把j对应的数写入临时数组 j++ temp[k++] = arr[j++]; } } //4.判断把剩余的数字,依次写入临时数组 //前一组中还有值 while (i<=mid ){ temp[k++] = arr[i++]; } //后一组中有值 while (j<= high){ temp[k++] = arr[j++]; } //5.把临时数组的数值,回写到arr for (int l = low; l <=high ; l++) { //参数值是下角标,所以应<= arr[l] = temp[l]; } } }