归并排序(Merge Sort)

上动图:
在这里插入图片描述
所有元素不断地拆成两份,拆到最小的只剩两个,然后就进行排序,不断往上排序复合。
分治法和递归思想。
这玩意好像有点难理解。。。。


    //归并排序,递归和合并
    public static <E extends Comparable<E>> void sort(E[] data,int l,int r){
        if (l>=r)return ;//求解最基本问题
        int mid=(l+r)/2;
        //对data[l,mid]进行
        sort(data,l,mid);//递归分解
        //对dat(mid,r]进行             //把原问题转换成小问题
        sort(data,mid+1,r);//递归分解
        //合并数组  将两个有序的数组合成一个数组
        //将data[l...mid]和data[mid+1...r]合并
        merge(data,l,mid,r);            //如何合并?
    }

    public static <E extends Comparable<E>> void merge(E[] data,int l,int mid, int r){
        E[] temp= Arrays.copyOfRange(data,l,r+1);//复制一个数组  data和temp数组元素对应位置偏移l个位置

        int i=l,j=mid+1;
        for (int k=l;k<=r;k++){
            //data[i]和data[j]对比
            if (i>mid){//i左边的元素放完了,i越界
                data[k]=temp[j-l];//剩下的j到r是有序的,就可以直接放进去原数组中了
                j++;
            }else if (j>r){//j右边的元素放完了,j越界了
                data[k]=temp[i-l];
                i++;
            }else if (temp[i-l].compareTo(temp[j-l])<=0){//对比两边的数组,小的在左边,i不断地右移动,继续对比
                data[k]=temp[i-l];
                i++;
            }else {
                //if (temp[i-l].compareTo(temp[j-l])>=0)//对比两边的数组,小的在右边,j不断地右移动,继续对比
                data[k]=temp[j-l];
                j++;
            }
        }
    };

    public static void main(String[] args){
        Integer[] data={16,8,30,9,2,678,0,2,4,0,1};
        sort(data,0,data.length-1);
        for (int i=0;i<data.length;i++){
            System.out.print(" "+data[i]);
        }
        System.out.println();
    }

说些屁话:键盘鼠标真好用,声音嘎嘎脆,真香,越来越爱电子产品了。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值