AcWing 787. 归并排序

news/2024/5/17 17:42:50 标签: acwing, 归并排序

Problem: AcWing 787. 归并排序

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

归并排序是一种分治算法。首先将数组分为两半,然后对每一半进行排序,最后将两个已排序的部分合并在一起。这个过程会递归地应用到每一半。

解题方法

如果数组只有一个元素,那么它已经排序了,直接返回。
否则,找到数组的中点,将数组分为两半。
对每一半递归地进行归并排序
将两个已排序的部分合并在一起。

复杂度

时间复杂度:

归并排序的时间复杂度为 O ( n l o g n ) O(n log n) O(nlogn),其中n是数组的长度。这是因为算法每次将数组分为两半,然后对每一半进行排序,所以时间复杂度为 O ( l o g n ) O(log n) O(logn)。然后,合并两个已排序的部分的时间复杂度为 O ( n ) O(n) O(n)。因此,总的时间复杂度为 O ( n l o g n ) O(n log n) O(nlogn)

空间复杂度:

归并排序需要一个与原数组同样大小的辅助数组,所以空间复杂度为 O ( n ) O(n) O(n)

Code


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	static StreamTokenizer sr = new StreamTokenizer(in);
	static int n;
	static int MAXN = (int) (1e5 + 10);
	static int[] arr = new int[MAXN];
	static int[] help = new int[MAXN];

	public static void main(String[] args) throws IOException {
		n = nextInt();
		for (int i = 0; i < n; i++) {
			arr[i] = nextInt();
		}
		mergeSort(0, n - 1);
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < n; i++) {
			sb.append(arr[i]);
			sb.append(" ");
		}
		out.println(sb);
		out.flush();

	}

	private static void mergeSort(int l, int r) {
		if (l == r) {
			return;
		}
		int m = (l + r) / 2;
		mergeSort(l, m);
		mergeSort(m + 1, r);
		merge(l, m, r);
	}

	private static void merge(int l, int m, int r) {
		int i = l;
		int a = l;
		int b = m + 1;
		while (a <= m && b <= r) {
			help[i++] = arr[a] <= arr[b] ? arr[a++] : arr[b++];
		}

		while (a <= m) {
			help[i++] = arr[a++];
		}
		while(b <= r) {
			help[i++] = arr[b++];
		}
		for(int j = l; j <= r; j++) {
			arr[j] = help[j];
		}

	}

	static int nextInt() throws IOException {
		sr.nextToken();
		return (int) sr.nval;
	}

}

http://www.niftyadmin.cn/n/5379085.html

相关文章

迷失在前端框架中的初级开发者,总觉得大厦要从二层开始建

知乎有人提问&#xff1a;现在是框架主导前端时代&#xff0c;还有必要学习Html&#xff0c;CSS和JavaScript吗&#xff1f;我看很愕然&#xff0c;框架可以节省力气&#xff0c;难道都可以替代前端基础了吗&#xff1f; 一、起因 因为贝格前端工场的主营业务就是前端开发&…

【JavaScript】localStorage 和 sessionStorage

文章目录 1. localStorage和sessionStorage的概念localStoragesessionStorage 2. localStorage和sessionStorage的使用设置数据读取数据删除数据清空所有数据 3. localStorage和sessionStorage的应用场景localStoragesessionStorage 4. 安全性注意事项5. 总结 在前端开发中&…

《UE5_C++多人TPS完整教程》学习笔记14 ——《P15 创建我们自己的子系统(Creating Our Own Subsystem)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P15 创建我们自己的子系统&#xff08;Creating Our Own Subsystem&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&…

波奇学Linux:文件系统打开文件

从文件系统来看打开文件 计算机系统和磁盘交互的大小是4kb 物理内存的4kb&#xff0c;磁盘的4kb文件叫做页帧 磁盘数据块的以4kb为单位。 减少IO的次数&#xff0c;减少访问外设的次数--硬件 基于局部性的原理&#xff0c;预加载机制--软件 操作系统管理内存 操作系统对…

C++ STL->list模拟实现

theme: smartblue list list文档 list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一个元素…

【python】python入门(变量名)

Hi~ o(*&#xffe3;▽&#xffe3;*)ブ今天一起来看看python入门之变量名吧~~ 变量名的规定&#xff1a; 举个例子&#xff1a; “违法”的变量名们 my love/my &#xff01;love错误&#xff1a;中间不能是空格或者其他符号1my_love错误&#xff1a;不能数字开头"my_l…

嵌入式——Flash(W25Q64)

目录 一、初识W25Q64 1. 基本认识 2. 引脚介绍 ​编辑 二、W25Q64特性 1. SPI模式 2. 双输出SPI方式 三、状态寄存器 1. BUSY位 2. WEL位 3. BP2、BP1、 BP0位 4. TB位 5. 保留位 6. SRP位 四、常用操作指令 1. 写使能指令&#xff08;06h&#xff09; 2. 写禁…

16.1 Spring框架_AOP面向切面编程(❤❤❤❤)

16.1 Spring框架_AOP面向切面编程 1. AOP介绍及相关概念名词1.1 需求分析1.2 简介2. AOP开发与配置流程2.1 入门实战_基于xml配置(❤❤)1. 依赖引入2. spring配置文件:基础格式3. 加载配置文件,启动Spring容器4. 定义切面:获取各层类信息5. 在applicationContext.xml配置切点和…