归并排序

不问归期 提交于 2019-11-29 23:45:10

归并排序,分治法

import java.util.Arrays;

public class Main_05 {

    public static final int MAX = 10000;

    /**
     * 分归并排序,分治法
     * @author 1016795105@qq.com
     * @param args
     */
    public static void main(String[] args) {
        int [] num = new int[MAX];
        for (int i = 0; i < MAX; i++) {
            num[i] = MAX -i;
        }
        merge_sort(num,0,num.length-1);
        Arrays.stream(num).forEach(System.out::println);
    }


//方法入口
    public static void merge_sort(int[] num, int left, int right) {
        if(left >= right)    return;
        int middle = (right + left) / 2;
        merge_sort(num, left, middle);
        merge_sort(num, middle+1, right);
        merge(num,left,right,middle);
    }

//合并方法
    public static void merge(int[] num, int left, int right, int middle) {
        int saveLeft = left;
        int saveRight = right;
        //右半边开始
        int rightStart = middle + 1;
        //暂存
        int[] save = new int[right - left + 1];
        int i = 0 ;
        //归并
        while (left <= middle &&  rightStart <= right) {
            if(num[left] <= num[rightStart]){
                save[i++] = num[left++];
            }else{
                save[i++] = num[rightStart++];
            }
        }
        while (rightStart <= right){
            save[i++] = num[rightStart++];
        }
        while (left <= middle){
            save[i++] = num[left++];
        }
        //覆盖
        for (i = saveLeft; i <= saveRight; i++) {
            num[i] = save[i - saveLeft];
        }
    }
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!