数据结构与算法——排序算法(4)——归并排序

本文详细介绍了归并排序的基本思想、图解原理和两种代码实现方式,包括递归和迭代。通过分治策略,将序列分解为两部分分别排序,然后合并成有序序列。归并排序的时间复杂度为O(nlgn),空间复杂度为O(n)。
摘要由CSDN通过智能技术生成

目录

1.基本思想

2.图解原理

3.代码实现

3.1 递归实现(自定向下的实现)

3.2 迭代实现

4.性能分析


1.基本思想

  • 归并排序是利用分治策略实现的
    • 分阶段:将问题分成一些小的问题递归求解
    • 治阶段:将分阶段得到的子问题的解合并在一起
  • 使用分治策略的三个步骤分析归并排序:
    • 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列(只是分解,并未做任何处理
    • 解决:递归地排序两个子序列
    • 合并:合并两个已排序的子序列为一个排好序的的序列 

2.图解原理

合并过程:

再来看看上述的治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤:

 

3.代码实现

归并排序我们采用递归去实现,也可采用迭代的方式去实现

3.1 递归实现(自定向下的实现)

public class MergeSort extends Sort{
    @Override
    public void sort(Comparable[] arr) {
        mergeSort(arr,0,arr.length-1);
    }


    private void mergeSort(Comparable[] arr,int left,int right){
        /**
         * 递归结束的条件,即right最终是等于left的
         */
        if(left >= right) {
            return;
        }


        int middle = (left + right)/2;

        //递归分解左边的子数组
        mergeSort(arr,left,middle);
        //递归分解右边的子数组
        mergeSort(arr,middle+1,right);
        /**
         * 以上递归最终会执行完,最终的子数组均为单个元素(left==right),此时就应该进行合并
         *
         * 在合并的过程中完成排序处理
         */
        //合并子数组
        merge(arr,left,middle,right);

    }

    /**
     * 合并方法
     *
     * 此方法是将子数组arr[left...middle]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值