归并排序

归并排序

本文分为以下几个部分

问题引入

master 公式

归并排序

写在最后

问题引入

求一串非空数组中的最大值,使用O(n)的时间复杂度。

最直接想到的代码就是直接一次遍历

@Test
public void maxNum1(){
    int arr[] = {2, 3, 4, 1, 54, 1, 0};
    int max = arr[0];
    for(int i = 1; i < arr.length; i++){
        max = Math.max(max,arr[i]);
    }
    System.out.println(max);
}

另一种不容易想到的是递归

@Test
public void maxNum2(){
    int[] arr = {2, 3, 4, 1, 54, 1, 0};
    System.out.println(getMax(arr, 0, arr.length - 1));
}

private int getMax(int[] arr,int L,int R){
    if(L == R){
        return arr[L];
    }
    //取中点值,直接使用 (R+L)/2 可能会越界
    //L+(R-L)/2 ,除2等同于位运算右移一位,位运算相对除法较快
    int mid = L + ((R-L)>>1);
    int M1 = getMax(arr,L,mid);
    int M2 = getMax(arr,mid+1,R);
    return Math.max(M1,M2);
}

代码流程如下

归并排序

将数据两两分,然后再细分,分到最后,会到 L == R,然后 return 回去,右递归或者比较左右两遍的数,return 较大的数。

用到了递归,怎么说他的时间复杂度是 O(n) 呢?

使用Mater公式来计算!

Master 公式

直接上公式

归并排序

时间复杂度计算

归并排序

相当于上面一题,每次 getMax() 方法中递归调用了两次,所以 a 2,每次相对上次的数据规模为一半,所以 b = 2,除递归外其他的时间复杂度为 O(1),所以 d = 0

logb a = 1, d = 0,所以时间复杂度为 O(n),符合题意。

归并排序

类似上面的取大数的递归方法,多个数排序,可以看成两个数排序,然后越来越多的数排序。

取大数就是两个数比较,得出大数,然后继续和其他的比较,此时其实就是多个数在比较了。

和取大数的比较,不同点就在一个是取数,一个是排序,其他都相同。

排序方法

归并排序

数组分成两个,同时两个指针从左到右依次遍历,新建一个数组,哪个数据小,就添加到新数组当中。

由于都是从数据量小开始,所以小数据会先排序,最后会成两个已经排好序的数组再进行排序。

归并排序
@Test
public void sort(){
    int arr[] = {2, 3, 4, 1, 54, 1, 0};
    dfs(arr,0,arr.length-1);
    System.out.println(Arrays.toString(arr));
}

private void dfs(int[] arr,int L,int R){
    if(L == R){
        return;
    }
    int mid = L + ((R-L)>>1);
    dfs(arr,L,mid);
    dfs(arr,mid+1,R);
    mergeSort(arr,L,mid,R);
}

private void mergeSort(int[] arr,int L,int mid,int R){
    int[] copy = new int[R-L+1];
    int RStart = mid + 1;
    int LStart = L;
    int copyStart = 0;
    while (LStart

时间复杂度计算

使用 master 公式

a = 2; b = 2; 除递归的时间复杂度为 O(n),就是遍历两遍 L-R 的数组,所以时间复杂度为 O(n),所以 d = 1

logb a = 1, d = 1,符合第二个

所以递归时间复杂度为 O(n log n) (计算机中通常log都定义为以2为底的数,log2)

写在最后

看上面 gif 图理解就行,剩下递归理解第一个问题就行。

Original: https://www.cnblogs.com/ytryhard/p/15638910.html
Author: 抱糖果彡
Title: 归并排序

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/571021/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Centos7 安装Git 版本控制

    Centos7 安装Git 版本控制 最近开始认真学习一遍git ,虽然已经使用git 蛮久了,但是其实对这个的了解 可能也就是 使用层面了。。提供一个 git 官网 zh (中文…

    Java 2023年6月9日
    090
  • Nginx模块开发入门

    Nginx配置文件基本结构 配置文件可以看做是Nginx的灵魂,Nginx服务在启动时会读入配置文件,而后续几乎一切动作行为都是按照配置文件中的指令进行的,因此如果将Nginx本身…

    Java 2023年5月30日
    072
  • JDBC线程池创建与DBCP源码阅读

    创建数据库连接是一个比较消耗性能的操作,同时在并发量较大的情况下创建过多的连接对服务器形成巨大的压力。对于资源的频繁分配﹑释放所造成的问题,使用连接池技术是一种比较好的解决方式。 …

    Java 2023年5月29日
    077
  • MySQL 事务基础知识

    数据库事务概述 事务是数据库区别于文件系统的重要特性之一,当我们有了事务就会让数据库始终保持 &#x4E00;&#x81F4;&#x6027;,同时我们还能…

    Java 2023年6月8日
    076
  • window server 2019环境下将nginx配置为开机自启动服务

    公司window服务器上面有个nginx在跑,重启服务器后没有自动启动,需要手动运行nginx,如果是非正常重启业务可能就中断了 1、下载WinSW(window service …

    Java 2023年5月30日
    067
  • 3、封装和继承

    隐藏细节 通过访问修饰符private,有些细节不需要用户直接访问,将他隐藏起来。只能间接访问,通过提供一些共有的接口(给外部提供一个可以调用的方法) 会写JavaBean fin…

    Java 2023年6月6日
    068
  • Linux 用户及组相关命令

    与用户相关的配置文件:/etc/passwd: #用户的配置文件, 保存用户账户的基本信息/etc/shadow #用户影子口令文件 一、用户帐号文件——passwd 1.&#82…

    Java 2023年6月7日
    073
  • CSS速学!!

    padding:内边距 缩写:缩写: padding:值; 上下左右的内边距一样 padding:值1 值2; 值1代表上下内边距,值2代表左右内边距 padding:值1 值2 …

    Java 2023年6月9日
    068
  • 图解|12张图告诉你MySQL的主键查询为什么这么快

    这是图解MySQL的第3篇文章,这篇文章会让大家清楚地明白: 什么是InnoDB行格式?InnoDB页是什么? InnoDB页和InnoDB行格式都有哪些字段信息? 为什么推荐使用…

    Java 2023年6月7日
    088
  • Java源码详解系列(十二)–Eureka的使用和源码

    eureka 是由 Netflix 团队开发的针对中间层服务的负载均衡器,在微服务项目中被广泛使用。相比 SLB、ALB 等负载均衡器,eureka 的服务注册是无状态的,扩展起来…

    Java 2023年6月13日
    079
  • LeetCode刷题

    1.53最大和的连续子数组 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 class…

    Java 2023年6月5日
    073
  • 【Java面试】准备跳槽!那这期面试题必须要会,请描述一下Redis的缓存淘汰策略

    “请你描述一下Redis的缓存淘汰策略”你如果你正好遇到这个问题,想好怎么回答了吗?关于这个问题,我把高手的回答整理到了15W字的面试文档里面大家可以私信留…

    Java 2023年6月16日
    079
  • 数据结构与算法之分治策略

    用循环计算两个数字的乘积 用循环解决这个问题只能是类似于小学乘法个位与个位相乘,个位与十位相乘。十位与个位相乘,十位与十位相乘。此算法的时间复杂度为O(n^2) public st…

    Java 2023年6月8日
    0101
  • SpringBoot自定义环境变量——EnvironmentPostProcessor

    现有需求是将数据库配置文件中账号密码相关信息分离且加密,用到了SpringBoot中 EnvironmentPostProcessor接口。可以将外部配置文件读取注入系统中。 实现…

    Java 2023年6月9日
    084
  • Android WebView默认GONE出现的问题记录

    前段时间重构一批相似度80%以上的项目【真搞不懂前人们是怎么忍受十几个类似的应用一直CVU的,冗余代码和资源达到40%以上】 其中需要抽出一个公共的带WebView的Activit…

    Java 2023年6月9日
    071
  • 这个开源组织里的项目都是精品(第二弹)

    前言 之前我写过一篇文章——《这个开源组织里的项目都是精品》,里面列举了Dromara开源组织的4个java项目,每一个都轻量且实用,受到了很多小伙伴的喜爱。Dromara这个开源…

    Java 2023年6月8日
    096
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球