归并排序(MergeSort )

常见的排序算法:

归并排序(MergeSort ):

对数组进行二分法分割,对分割后的数组分别进行排序,然后再将排好序的数组进行合并
在这里插入图片描述

public class MergeSort {
    static int count = 0;
    public static void main(String[] args) {
        int[] array = {10,9,8,7,6,5,4,3,2,1};
        array = mergeSort(array);
        System.out.println(Arrays.toString(array));
        System.out.println(count);
    }
    //二分法拆分数组
    public static int[] mergeSort(int[] array){
        //如果数组长度已经被拆分到了1个,那么返回该数组
        if (array.length<2)
            return array;
        //选取中点
        int mid = array.length/2;
        //拆分后的左边部分
        int[] left = Arrays.copyOfRange(array,0,mid);
        //拆分后的右边部分
        int[] right = Arrays.copyOfRange(array,mid,array.length);
        //将拆分后的数组进行有序合并
        return merge(mergeSort(left),mergeSort(right));
    }
    //将两部分各自有序的数组合并为一个数组
    public static int[] merge(int[] left,int[] right){
        //先确定合并后数组的长度
        int[] result = new int[left.length+right.length];
        //循环为结果数组赋值
        for (int i = 0, j = 0, k = 0; k<result.length; k++){
            count++;//统计循环次数,用于查看时间复杂度
            //如果左右两边的其中一个数组已经全部放到了result中,那么我们只需要将剩余数组的内容按顺序放到result数组中
             if (i >= left.length && j < right.length){
                result[k] = right[j++];
            }else if (i < left.length && j >= right.length){
                result[k] = left[i++];
            }
            //如果两个数组都有剩余,那么我们就将两个数组中的当前最小值放入result中(当前这两个数组都是有序的)
             else if (left[i] < right[j]){
                result[k] = left[i++];
            }else if (left[i] > right[j]){
                result[k] = right[j++];
            }
        }
        return result;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值