手撕面试题算法<排序>(4)—— 归并排序

本文介绍了归并排序算法,包括其分治思想、时间复杂度分析,详细讲解了数组的拆分和归并过程,并提供了面向用户的入口方法。归并排序具有O(n*logn)的时间复杂度,常在面试中被问及。
摘要由CSDN通过智能技术生成

前言

归并排序是一个相当快速的算法,其时间复杂度稳定在O(n*logn),在面试中被问到的频率也挺高的,今天就来介绍一下这个排序算法

手撕算法 - 排序系列

手撕面试题算法<排序>(1)—— 冒泡排序及其优化实现
手撕面试题算法<排序>(2)—— 选择排序
手撕面试题算法<排序>(3)—— 插入排序及其优化实现
手撕面试题算法<排序>(3.5)—— 希尔排序
手撕面试题算法<排序>(4)—— 归并排序
手撕面试题算法<排序>(5)—— 快速排序以及快排为什么快
手撕面试题算法<排序>(6)—— 堆 & 堆排序
手撕面试题算法<排序>(7)—— 箱排序 & 基数排序

源码

看完有收获别忘了点个star哦~

归并排序

思想

在归并排序中体现的是分治的思想,其将一个数组一分为二,二分为四,直到不能再分——将难以处理的大问题拆分成容易处理的小问题,最后再将排序完毕的数组合并在一起,完成数组的排序
动图演示

时间复杂度

将一个数组对半拆分处理的时间复杂度是O(logn)
例,对一个长度为n的数组进行递归拆分:

  • 第1次递归,将n个数拆分为2个子区间,每个子区间长度为n/2
  • 第2次递归,将n个数拆分为4个子区间,每个子区间长度为n/4
  • 第3次递归,将n个数拆分为8个子区间,每个子区间长度为n/8
  • 第logn次递归,将n个数拆分为n个子区间,每个子区间长度为1

而每次对子区间的排序的次数为:

  • 第一次递归后的排序,遍历2个长度为n/2的数组,O(n)
  • 第二次递归后的排序,遍历4个长度为n/4的数组,O(n)

所以归并排序总共需要走logn次O(n)的操作,的时间复杂度为 O(n*logn)

实现

1. 核心 - 数组的拆分

我们使用递归来将数组进行拆分
通过传入的数组,以及区间[L, R],来对半划分数组,并将划分后的L, R记录下来进行下一次递归,直到 L >= R

    private static void sort(int[]
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这里假设List<String>中每个字符串包含的信息是学生的姓名和年龄,以逗号分隔。 可以使用Java 8的Stream API来进行转换,具体步骤如下: 1. 定义一个Student类,包含姓名和年龄属性: ```java public class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } // getter和setter方法省略 } ``` 2. 使用Stream API进行转换: ```java List<String> stringList = Arrays.asList("Tom,18", "Jerry,20", "Alice,19"); List<Student> studentList = stringList.stream() .map(s -> s.split(",")) .map(arr -> new Student(arr[0], Integer.parseInt(arr[1]))) .collect(Collectors.toList()); ``` 首先使用stream()方法将List<String>转换成Stream<String>,然后使用map()方法将每个字符串转换成一个String[]数组,其中第一个元素是姓名,第二个元素是年龄。接着使用map()方法将每个String[]数组转换成一个Student对象,最后使用collect()方法将Stream<Student>转换成List<Student>。 3. 完整代码: ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> stringList = Arrays.asList("Tom,18", "Jerry,20", "Alice,19"); List<Student> studentList = stringList.stream() .map(s -> s.split(",")) .map(arr -> new Student(arr[0], Integer.parseInt(arr[1]))) .collect(Collectors.toList()); System.out.println(studentList); } } class Student { private String name; private int age; public Student(String name, int age) { this.name = name; this.age = age; } // getter和setter方法省略 @Override public String toString() { return "Student{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` 输出结果: ``` [Student{name='Tom', age=18}, Student{name='Jerry', age=20}, Student{name='Alice', age=19}] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值