归并排序


前言

好久没有更新文章啦,前段时间练习JavaWeb的一个项目去了,有一说一,没有用到spring的系列框架,构建一个javaweb的项目确实有点麻烦,最后卡在了用jsp实现购物车的功能。后续,等到自己Java功底逐渐成熟过后,我也会更新JavaWeb相关的文章


今天给大家带来的是一种高级排序

归并排序


一、什么是归并排序?

以整个数组为对象执行mergeSort
mergeSort:
1.将给定的包含n个元素的局部数组分割成两个局部数组,
每个数组包含n/2个元素
2.对两个局部数组分别执行mergeSort排序
3.通过merge将两个已经排序完毕的局部数组“整合”成一个数
组

二、分析步骤

1.分割数组

在解释分割数组之前,我们不得不提一下分治法。

分治法可以通俗的解释为:把一片领土分解,分解为若干块小部分,然后一块块地占领征服,被分解的可以是不同的政治派别或是其他什么,然后让他们彼此异化。
分治法的精髓:
分–将问题分解为规模更小的子问题;
治–将这些规模更小的子问题逐个击破;
合–将已解决的子问题合并,最终得出“母”问题的解;

简单的来说,分三步:
1.将问题“分割”
2.递归求解局部问题
3.整合,解决原问题

2.分别排序

这里我们用到递归,分别对分割后的两个数组进行排序

mergeSort(A,n,left,mid);
mergeSort(A,n,mid,right);

3.整合数组

这里在提一点,在递归时,一定要有结束条件,所以,这里给出merge进行递归结束。

void merge(int[] A,int n,int left,int mid,int right){
        int n1 = mid - left;
        int n2 = right - mid;
        for (int i = 0; i < n1; i++) {
            L[i] = A[left+i];
        }
        for (int i = 0; i < n2; i++) {
            R[i] = A[mid+i];
        }
        L[n1] = R[n2] = SENTINEL;
        int i = 0,j = 0;
        for (int k = left; k < right; k++) {
            cut++;
            if (L[i]<=R[j])
                A[k] = L[i++];
            else
                A[k] = R[j++];
        }
    }

总结

所谓的高等排序,都是将初等函数进行分割,在用分治的思想构建而成。

需要完整的代码来我的GitHub

在这里插入图片描述

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值