前言

本文为本小白🤯学习数据结构的笔记,将以算法题为导向,向大家更清晰的介绍数据结构相关知识(算法题都出自🙌B站马士兵教育——左老师的课程,讲的很好,对于想入门刷题的人很有帮助👍)

上面讲了归并排序,这个思想非常好✌️(用了递归来降低时间复杂度),这里我想再写写归并排序的实质,以及用这个思想来解决一些问题。

✌️首先来看看归并排序是怎么实现排序的

package DiGui;public class hhhguibing {public static void process(int[] arr,int L,int R){if (L==R) {return;}int mid=L + ((R-L)>>1);process(arr,L,mid);process(arr,mid+1,R);merge(arr,L,mid,R);}public static void merge(int[] arr,int L,int mid,int R){int[] help=new int[R-L+1];int i=0,p1=L,p2=mid+1;while(p1<=mid&&p2<=R){help[i++]=arr[p1]<arr[p2]?arr[p1++]:arr[p2++];}while(p1<=mid){help[i++]=arr[p1++];}while(p2<=R){help[i++]=arr[p2++];}for (i=0; i < help.length; i++) {arr[L+i]=help[i];}}
}
1.🧩先来解析一下代码结构
public static void process(int[] arr, int L, int R)

这是递归函数,负责“分”的过程。

  • L 和 R 表示当前处理的区间 [L, R]。

    • 递归处理左半部分:process(arr, L, mid)
    • 递归处理右半部分:process(arr, mid+1, R)

最后调用 merge(arr, L, mid, R) 把左右两部分合并成有序的

public static void merge(int[] arr, int L, int mid, int R)
  • 合并两个有序数组

    • 因为有前面的递归过程,到merge时, [L, mid] 是有序的,[mid+1, R] 也是有序的
    • 创建一个辅助数组 help,用来暂存合并后的结果
    • 用两个指针 p1 和 p2 分别指向左右两个有序区的开头
    • 比较 arr[p1] 和 arr[p2],把较小的放进 help,对应指针后移
    • 一方遍历完后,把另一方剩下的元素全部复制过去
      最后把 help 中排好序的内容写回原数组 arr[L…R]
💡三、举个例子说明过程

假设数组是:[4, 1, 3, 2]

初始:[4, 1, 3, 2]↓ 分[4, 1]     [3, 2]↓           ↓[4] [1]     [3] [2]   ← 到底了,开始合并↓           ↓[1,4]       [2,3]   ← 合并两个有序对↓ 合并[1,2,3,4]         ← 排序完成

🤔那为什么归并排序比普通的排序时间复杂度更低呢?

🌟 核心思想:避免重复的无效比较

一、来看看传统排序(O(n²))的“时间浪费”在哪?
插入排序为例子:

数组: [5, 4, 3, 2, 1]插入 4:要和 5 比较一次,移动 5
插入 3:要和 45 比较,移动 45
插入 2:要和 345 比较,移动 345
插入 1:要和 2345 比较,移动全部

👉 每个新元素都要从后往前逐个比较,平均要比较 O(n) 次,总共 n 个元素 → 总时间 O(n²)

  • 插入排序…等:每一步只“推进”一个元素的位置,过程中做了大量重复且低效的比较和移动。
  • 归并排序:通过 分治 + 合并有序数组 的方式,让每一次比较都“更有价值”。

🌏归并排序扩展问题:

1.小和问题:
在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。
例子:[1,3.4.2.5]1左边比1小的数,没有:3左边比3小的数,1;4左边比4小的数,1、3; 2左边比2小的数,1;5左边比5小的数,1、3、4、2;所以小和为1+1+3+1+1+3+4+2=16

为了更直观的来看,用递归方法解小和问题更高效,我先写(O(n²))的暴力解法

public static int smallSum (int[] arr) {int sum = 0;for (int i = 1; i < arr.length; i++) {for (int j = 0;j < i;j++) {if (arr[j] < arr[i]) {sum += arr[j];}}}return sum;
}        

🚀 高效解法:利用 归并排序 → O(n log n)

先解释一下 :

这个是把小和问题先转化了一下,将原问题(每一个数左边比当前数小的数累加起来),转化为每个数右边有几个比它大,就说明这个数本身,被累加了几次。
例子:[1,3.4.2.5]1右边比1大的数,有4个:3右边比3大的数,有2个;4右边比4大的数,有1个; 2右边比2大的数,有1个;5右边比5大的数,没有;所以小和为1 * 4+3 * 2+4 * 1+2 * 1+5 * 0=16;

那么我们只需要统计每个数右边有几个比它大,就可以了

public static void process(int [] arr,int L,int R) {if (L ==R ) {return 0;}int mid = L + ((R-L)>>1);return process(arr , L,mid) + process(arr , mid+1, R) + merge(arr,L,mid,R);
}public static int merge(int[] arr,int L,int mid,int R){int help=new int [R-L+1];int i=0,p1=L,p2=mid+1;int res=0;//记录小和数while(p1<=mid&&p2<=R){res+=arr[p1] <arr[p2] ? (r-p2+1) * arr[p1] : 0;help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];}while(p1<=mid) {help[i++] = arr[p1++];}while(p2<=r) {help[i++] = arr[p2++];}for( i=0;i<help.length;i++) {arr[L +i] = help[i];}return res;
}

逆序对问题:
逆序对问题在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对,请打印所有逆序对数。

这道题一样的,刚才小和问题是求每个数右边有几个比它大,这个是求每个数右边有几个比它小

public static void process(int [] arr,int L,int R) {if (L ==R ) {return 0;}int mid = L + ((R-L)>>1);return process(arr , L,mid) + process(arr , mid+1, R) + merge(arr,L,mid,R);
}public static int merge(int[] arr,int L,int mid,int R){int help=new int [R-L+1];int i=0,p1=L,p2=mid+1;int res=0;//记录小和数while(p1<=mid&&p2<=R){res+=arr[p1] > arr[p2] ? (r-p2+1) * arr[p1] : 0;help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];}while(p1<=mid) {help[i++] = arr[p1++];}while(p2<=r) {help[i++] = arr[p2++];}for( i=0;i<help.length;i++) {arr[L +i] = help[i];}return res;
}

小白啊!!!写的不好轻喷啊🤯如果觉得写的不好,点个赞吧🤪(批评是我写作的动力)

…。。。。。。。。。。。…请添加图片描述

…。。。。。。。。。。。…

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93942.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93942.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/93942.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

税务专业人员能力构建与发展路径指南

CDA数据分析师证书含金量高&#xff0c;适应了未来数字化经济和AI发展趋势&#xff0c;难度不高&#xff0c;行业认可度高&#xff0c;对于找工作很有帮助。一、税务专业人员的核心能力框架能力维度关键技能要素专业工具与方法论实践输出成果税务法规应用税种政策解读、法规更新…

Linux中rsync使用与inotify实时同步配置指南

Linux中rsync使用与inotify实时同步配置指南 一、rsync 简介 rsync&#xff08;Remote Sync&#xff09;是 Linux 系统下的一款高效数据镜像和备份工具&#xff0c;用于在本地或远程同步文件和目录。 支持本地复制、基于 SSH 的远程同步&#xff0c;以及使用自有 rsync 协议的同…

Unicode 字符串转 UTF-8 编码算法剖析

&#x1f4ca; Unicode 字符串转 UTF-8 编码算法剖析 ——从 C# char 到 C wchar_t 的编码转换原理 引用&#xff1a;UTF-8 编解码可视化分析 &#x1f50d; 1. 算法功能概述 该函数将 Unicode 字符串&#xff08;C# string&#xff09;转换为 UTF-8 编码的字节数组&#xf…

php的安全性到底怎么样

PHP作为一种流行的服务器端脚本语言&#xff0c;被广泛应用于Web开发。然而&#xff0c;由于PHP是一种较为灵活的语言&#xff0c;其安全性议题一直备受争议。在这篇文章中&#xff0c;我将从多个方面来讨论PHP的安全性&#xff0c;包括常见的安全漏洞、防范措施以及最佳实践。…

mapbox高阶,结合threejs(threebox)添加建筑glb模型,添加阴影效果,设置阴影颜色和透明度

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️threebox loadObj加载模型 二、🍀…

SSM从入门到实战:1.6 Spring数据访问与JDBC模板

&#x1f44b; 大家好&#xff0c;我是 阿问学长&#xff01;专注于分享优质开源项目解析、毕业设计项目指导支持、幼小初高的教辅资料推荐等&#xff0c;欢迎关注交流&#xff01;&#x1f680; 06-Spring数据访问与JDBC模板 &#x1f4d6; 本文概述 本文是SSM框架系列Spri…

下一代IT服务管理:ITIL5会是什么样?

ITIL4发布到现在也就5年多时间&#xff0c;按照以往的更新节奏&#xff0c;ITIL5最早也得2027年之后。但现在IT发展的速度&#xff0c;跟以前完全不是一个量级。AI都快把我们的饭碗抢了&#xff08;开个玩笑&#xff09;&#xff0c;ITIL要是还按部就班&#xff0c;估计真要被时…

最新研究进展:2023-2025年神经机器翻译突破性成果

文章目录 一、模型架构创新 1.1 混合架构的崛起 1.2 多模态翻译的突破 1.3 大语言模型与NMT的深度融合(2023-2024) 1.4 非自回归翻译(NAT)的效率革命(2024) 二、数据与训练策略优化 2.1 低资源语言翻译的飞跃 2.2 动态数据增强技术 三、效率与部署 3.1 模型压缩与加速 3.…

OpenTelemetry WebSocket 监控终极方案:打通最后一公里

概述 OpenTelemetry&#xff0c;以下简称 OTEL&#xff0c;是由 CNCF 托管的“一站式可观测性标准”&#xff0c;把指标、链路、日志三大信号统一为单一 SDK/API&#xff0c;零侵入地采集从浏览器、移动端到后端、容器、云服务的全栈遥测数据&#xff0c;并支持 40 后端一键导…

VS Code 出现的 Web 视图加载错误和服务工作者注册失败问题解决方案

针对 VS Code 或 Cursor &#xff08;vscode系&#xff09;中出现的 Web 视图加载错误和服务工作者注册失败问题&#xff0c;以下是永久性解决方案的完整操作指南&#xff1a;解决方案步骤打开命令面板 使用快捷键 CtrlShiftP&#xff08;Windows/Linux&#xff09;或 CmdShift…

【qml-4】qml与c++交互(类型多例)

背景&#xff1a; 【qml-1】qml与c交互第一次尝试&#xff08;实例注入&#xff09; 【qml-2】尝试一个有模式的qml弹窗 【qml-3】qml与c交互第二次尝试&#xff08;类型注册&#xff09; 【qml-4】qml与c交互&#xff08;类型多例&#xff09; 【qml-5】qml与c交互&#…

图数据库如何构筑 Web3 风控防线 聚焦批量注册与链上盗转 悦数图数据库

随着 Web3 生态的不断演进&#xff0c;链上风险呈现出团伙化、隐蔽化和动态化的趋势&#xff0c;传统的单点风控手段已难以应对复杂多变的攻击模式。尤其在批量注册薅羊毛与链上交易盗转洗钱等高频风险场景中&#xff0c;攻击者往往通过伪造身份、跨链操作、多层嵌套转账等方式…

恒流源电路学习

恒流源的设计原理&#xff1a; 如图所示你可以看到右边的的推到公式得到红点处的电压是一个和左边相关的定值&#xff0c;所以呢右边的电流就是电压除以那个4Ω&#xff0c;所以得到右边的电路的电流大体是一个定值&#xff0c;不管你再加什么东西都可以保持这个电流&#xff…

基于生成对抗网络的模糊图像恢复原理与技术实现

1. 引言图像模糊是数字图像处理中的常见问题&#xff0c;其成因包括相机抖动、物体运动、聚焦不良等。传统方法如维纳滤波、Lucy-Richardson 算法等依赖于模糊核估计和逆滤波&#xff0c;在复杂场景下性能有限。生成对抗网络&#xff08;Generative Adversarial Networks, GAN&…

【Doris 系列】Doris IP 变更修复

FE 恢复 异常日志 查看 fe.out 会有以下报错&#xff0c;此时 fe 进程是无法启动的&#xff0c;操作前注意备份所有 fe 的元数据并停止上游读写动作&#xff01; java.io.IOException: the self host 192.168.31.78 does not equal to the host in ROLE file 192.168.31.81. Yo…

安卓14系统应用收不到开机广播

安卓14系统应用收不到开机广播 - Wesley’s Blog 前段时间有测试反馈在安卓14 上面某系统应用恢复出厂设置后没有自启动&#xff0c;究竟是什么原因呢&#xff1f; 回顾 Android 从3.1开始&#xff0c;会将新安装并且从未被启动的应用置为“STOPPED”状态&#xff0c;或者被…

C# Attribute 方法扩展

场景 刚写完一个干净利落的方法&#xff0c;比如保存数据到数据库&#xff0c;逻辑清晰、结构优雅&#xff0c; 第二天&#xff0c;“嘿&#xff0c;保存完数据&#xff0c;记得给客户发个邮件哦~” 第三天&#xff0c;“能不能再发个消息通知其他系统&#xff1f;” 第四天&am…

【URP】[法线贴图]为什么主要是蓝色的?

【从UnityURP开始探索游戏渲染】专栏-直达 法线贴图呈现蓝紫色调&#xff08;尤其以蓝色为主&#xff09;是由其‌存储原理、切线空间坐标系设计及颜色编码规则共同决定的‌。 核心原因&#xff1a;法线向量的存储规则‌ ‌法线向量的物理范围‌ 法线是单位向量&#xff0c;…

驱动开发系列63 - NVIDIA 开源GPU驱动open-gpu-kernel-modules编译调试

目录 一:通过apt方式安装nvidia 驱动 二:通过 .run 方式安装nvidia驱动 三:编译安装nvidia开源内核驱动 四:验证和调试 五:卸载驱动 1. 以apt方式安装nvidia 驱动的卸载方法 2. 以.run方式安装nvidia驱动的卸载方法 六:安装CUDA环境 一:通过apt方式安装nvidia 驱动…

对KingbaseES架构的解析:从读写分离到异地灾备的技术实现与保障机制

声明&#xff1a;文章为本人真实测评博客&#xff0c;非广告&#xff0c;并没有推广该平台 &#xff0c;为用户体验文章 本人旨在分享最真实的用户体验&#xff0c;为关注此类产品的朋友们提供一个客观的参考。 文章目录一、架构全景&#xff1a;四级高可用构建数字基础1.1 物…