Java 归并排序

归并排序

原理

1.把数组从中间划分成两个子数组;
2.一直递归地把子数组划分成更小的子数组,直到子数组里面只有一个元素
3.依次按照递归的返回顺序,不断地合并排好序的子数组,直到最后把整个数组的顺序排好。

img

时间复杂度

O(nlogn),稳定性看比较大小时是否加=

API模板
package DataStructureAndAlgorithm.Sort.HartSort;

/**
 * 归并排序
 */
public class Merge {
    private static Comparable[] assist;
    //对外的整体排序
    public static void sort(Comparable[] c){
        assist=new Comparable[c.length];//辅助数组
        sort(c,0,c.length-1);

    }
    //内部分段排序,从索引low到索引high的排序,采用递归分治
    private static void sort(Comparable[] c,int low,int high){
        //划分到直至不可再分
        if(low>=high) return;

        int mid=low+(high-low)/2;//中间位置

        sort(c,low,mid);
        sort(c,mid+1,high);

        merge(c,low,mid,high);
    }
    //将分段排序好的数组整合成一个数组
    private static void merge(Comparable[] c,int low,int mid,int high){
        //辅助数组指针
        int i=low;
        //两个子组的指针
        int lo = low;
        int hi= mid+1;
        while (lo<=mid&&hi<=high){
            //选取两个子组元素的较小值存入辅助数组
            if(greater(c[lo],c[hi])){
                assist[i++]=c[hi++];
            }else{
                assist[i++]=c[lo++];
            }
        }
        //lo子组没有遍历完
        while (lo<=mid){
            assist[i++]=c[lo++];
        }
        //hi子组没有遍历完
        while (hi<=high){
            assist[i++]=c[hi++];
        }
        //将辅助数组已经排好序的子组复制到原数组
        for (int j = low; j <=high ; j++) {
            c[j] = assist[j];
        }
    }


    //判断前者是否大于后者
    private static boolean greater(Comparable c1 ,Comparable c2){
        return c1.compareTo(c2)>0;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值