归并排序

本文深入讲解归并排序算法,采用分治策略将数组逐步分解为更小的部分,并介绍如何通过递归实现数组的有序合并。文章详细展示了归并排序的具体步骤及其实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单分析:

归并排序是典型的用分治思想解决问题的算法, 其基本思想是: 有两个有序数组,从两个数组首端开始比较。将较大或较小的元素加入一个空数组中,同时在原数组中删除。剩下的元素如此重复。最后就将两个有序数组合并成一个有序数组了。这样的过程成为归并。

与分治法结合在一起来考虑。如果不断递归拆分数组,直到拆分到最后只有两个元素了,也就是说把一个数组分成两边,一边只有一个元素,这是两边自然是有序的,满足有序归并的要求

实现思路:

  • 1、先按归并排序原理实现数组的两部分合并。
  • 2、通过递归调用拆分数组到单个元素级,再同时递归合并。

完整代码

package myFunction;

public class MergeSort2 {
    //用于存放中间过程的数组
    private int arrCopy[];

    public void sort(int arr[]){
        this.arrCopy = new int[arr.length];

        //这里的left和right变量是数组的两个指针,指示数组两边,再计算出中间指针,便可以将数组一分为二。
        int left = 0,
            right = arr.length-1;

        //调用拆分方法
        cut(arr,left,right);
        arrCopy = null;
    }
    private void cut(int[] arr, int left, int right) {

        if(left < right){
            int canter = left + (right - left) / 2, 
                begin = left,
                end = right;
            cut(arr,begin,canter);
            cut(arr,canter+1,end);
            //前面可以看做是拆分数组,这里调用的方法可以看做合并数组
            merge(arr,left,canter,right);
        }
    }

    //将元素归并
    private void merge(int arr[],int left,int canter,int right) {

        int canterCopy = canter+1,
            leftCopy = left,
            i = left;//指示归并的起始下标位,就是对比后的元素从哪开始放

        while(leftCopy <= canter && canterCopy <= right){
            if(arr[leftCopy] <= arr[canterCopy]){
                arrCopy[i++] = arr[leftCopy++];
            }else{
            arrCopy[i++] = arr[canterCopy++];
            }
        }
        //如果数组的某一边有剩余元素,就把它们全部添加到中间数组。
        while(leftCopy <= canter){
            arrCopy[i++] = arr[leftCopy++];
        }
        while(canterCopy <= right){
            arrCopy[i++] = arr[canterCopy++];
        }
        //将数组copy回原数组。不然下次归并的数组就不是有序的了
        for(int j = left; j <= right;j++){
            arr[j] = arrCopy[j];
        }

    }


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值