分治算法之归并排序(Merge sort)

核心思想:递归

算法思路:一是分,二是治,分是将待排序数组划分为更小数组的过程,治是将两个数组有序排列并合并,直至还原到原数组长度。

算法性能:仅次于快速排序

时间复杂度:O(nlogn)

空间复杂度:O(n)

稳定性:稳定

算法图解:

 代码实现:

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random random = new Random();
        int[] arr = new int[20];
        for(int i = 0;i < 20;i++){
            int number = random.nextInt(100);
            arr[i] = number;
        }
        for(int arr1:arr){
            System.out.print(arr1+" ");
        }
        System.out.println();
        int[] arr1 = mergeSort(arr,0,arr.length - 1);
        for(int arr2:arr1){
            System.out.print(arr2+" ");
        }
    }

    public static int[] mergeSort(int[] arr,int b,int e){
        //只剩一个数时停止分裂,并返回
        if(b == e){
            return new int[]{arr[b]};
        }
        //中间值mind
        int mind = b+(e-b)/2;
        int[] leftArr = mergeSort(arr,b,mind);//左数组递归分裂
        int[] rightArr = mergeSort(arr,mind+1,e);//又数组递归分裂
        int[] temp = new int[leftArr.length+rightArr.length];//中间数组,做合并准备

        int m = 0,i = 0,n = 0;
        //开始合并,比较大小放入中间数组
        while(i < leftArr.length && n < rightArr.length){
            temp[m++] = leftArr[i]<rightArr[n] ? leftArr[i++] : rightArr[n++];
        }
        //待合并数组长度不同时的情况,将剩余元素放入数组
        while(i < leftArr.length){
            temp[m++] = leftArr[i++];
        }
        while(n < rightArr.length ){
            temp[m++] = rightArr[n++];
        }
        return temp;
    }

}

运行结果:

 

文章可能存在不足之处,欢迎大家交流指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值