归并排序详解(JAVA)

题目

使用归并算法排序

输入
[6,1,2,7,9,3,4,5,10,8]

输出
[1,2,3,4,5,6,7,8,9,10]

解析

归并算法其实是一种分治思想。先将数组递归拆分到最小粒度,再进行排序后合并。
在这里插入图片描述
其中合并治理使用空间换时间
在这里插入图片描述

编码

public static void main(String[] args) {
        int[] data = {6,1,2,7,9,3,4,5,10,8};
        print("输入",data);
        sort(data,0,data.length-1);
        print("\n输出",data);
    }

    private static int[] sort(int[] data,int low,int high){
        if(low<high){
            int mid=(low+high)/2;
            sort(data,low,mid);
            sort(data,mid+1,high);
            merge(data,low,mid,high);
        }
        return data;
    }

    private static void merge(int[] data,int low,int mid,int high){
        int[] temp = new int[high-low+1];
        List<Integer> ls= Arrays.stream(data).boxed().collect(Collectors.toList());
        print("\n合并过程:",new Object[]{low,mid,high});
        print("合并区间",ls.subList(low,high+1));
        int i=low;
        int j=mid+1;
        int k=0;
        while (i<=mid && j<=high){
            if(data[i]<data[j]){
                temp[k]=data[i];
                i++;
            }else{
                temp[k]=data[j];
                j++;
            }
            k++;
        }
        while(i<=mid){
            temp[k]=data[i];
            k++;
            i++;
        }
        while (j<=high){
            temp[k]=data[j];
            k++;
            j++;
        }
        print("合并后区间",temp);
        for (int l = 0; l < temp.length; l++) {
            data[low+l]=temp[l];
        }
        print("合并后数组",data);

    }

运行结果

输入:[6,1,2,7,9,3,4,5,10,8]

合并过程::[0,0,1]
合并区间:[6,1]
合并后区间:[1,6]
合并后数组:[1,6,2,7,9,3,4,5,10,8]

合并过程::[0,1,2]
合并区间:[1,6,2]
合并后区间:[1,2,6]
合并后数组:[1,2,6,7,9,3,4,5,10,8]

合并过程::[3,3,4]
合并区间:[7,9]
合并后区间:[7,9]
合并后数组:[1,2,6,7,9,3,4,5,10,8]

合并过程::[0,2,4]
合并区间:[1,2,6,7,9]
合并后区间:[1,2,6,7,9]
合并后数组:[1,2,6,7,9,3,4,5,10,8]

合并过程::[5,5,6]
合并区间:[3,4]
合并后区间:[3,4]
合并后数组:[1,2,6,7,9,3,4,5,10,8]

合并过程::[5,6,7]
合并区间:[3,4,5]
合并后区间:[3,4,5]
合并后数组:[1,2,6,7,9,3,4,5,10,8]

合并过程::[8,8,9]
合并区间:[10,8]
合并后区间:[8,10]
合并后数组:[1,2,6,7,9,3,4,5,8,10]

合并过程::[5,7,9]
合并区间:[3,4,5,8,10]
合并后区间:[3,4,5,8,10]
合并后数组:[1,2,6,7,9,3,4,5,8,10]

合并过程::[0,4,9]
合并区间:[1,2,6,7,9,3,4,5,8,10]
合并后区间:[1,2,3,4,5,6,7,8,9,10]
合并后数组:[1,2,3,4,5,6,7,8,9,10]

输出:[1,2,3,4,5,6,7,8,9,10]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值