排序-->归并排序

归并排序图解:

 

 代码实现:

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];
        }
    }
}

 

posted @ 2020-09-25 16:08  就是你baby  阅读(114)  评论(0编辑  收藏  举报