当前位置: 首页 > news >正文

【数据结构与算法】归并排序

归并排序

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而(conquer)的阶段则将分的阶段得到的各答案“修补”在一起,即分而治之)。

在这里插入图片描述

说明:

可以看到这种结构很像一颗完全二叉树,本文的归并排序我们采用递归去实现(也可以采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程。

代码实现:

public class MergerSort {public static void main(String[] args) {int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};int[] temp = new int[arr.length];mergeSort(arr, 0, arr.length - 1, temp);System.out.println(Arrays.toString(arr));}public static void mergeSort(int[] arr, int left, int right, int[] temp) {if (left < right) {int mid = (left + right) / 2; // 中间索引// 向左递归进行分解mergeSort(arr, left, mid, temp);// 向右递归进行分解mergeSort(arr, mid + 1, right, temp);// 到合并merge(arr, left, mid, right, temp);}}/*** 归并排序(合并)** @param arr   排序的初始数组* @param left  左边有序序列的初始索引* @param mid   中间索引* @param right 右边索引* @param temp  中转数组*/public static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left; // 初始化 i,左边有序序列的初始索引int j = mid + 1; // 初始化 j,右边有序序列的初始索引int t = 0; // 指向 temp 数组的当前索引// 一、// 先把左右两边(有序)的数据按照规则填充到 temp 数组// 直到左右两边的有序序列,有一边处理完毕为止while (i <= mid && j <= right) {// 若果左边的有序序列的当前元素,小于等于右边有序序列的当前元素// 即将左边的当前元素,填充到 temp 数组if (arr[i] <= arr[j]) {temp[t] = arr[i];t += 1;i += 1;} else { // 反之,将右边的当前元素,填充到 temp 数组temp[t] = arr[j];t += 1;j += 1;}}// 二、// 把剩余数据的一边的数据依次全部填充到 temp 数组while (i <= mid) { // 左边有序序列还有剩余元素temp[t] = arr[i];t += 1;i += 1;}while (j <= right) { // 右边有序序列还有剩余元素temp[t] = arr[j];t += 1;j += 1;}// 三、// 将 temp 数组的元素拷贝到 arr// 注意:并不是每次都拷贝所有t = 0;int tempLift = left;while (tempLift <= right) {arr[tempLift] = temp[t];t += 1;tempLift += 1;}}
}

性能测试:

 public static void main(String[] args) {int[] arr = new int[8000000];for (int i = 0; i < 8000000; i++) {arr[i] = (int) (Math.random() * 8000000); // 生成一个 [0,8000000) 随机数}int[] temp = new int[arr.length];long start = System.currentTimeMillis();mergeSort(arr, 0, arr.length - 1, temp);long end = System.currentTimeMillis();System.out.println("通过归并排序的时间:" + (end - start)); // 1504ms}

相关文章:

【数据结构与算法】归并排序

归并排序 归并排序&#xff08;MERGE-SORT&#xff09;是利用归并的思想实现的排序方法&#xff0c;该算法采用经典的分治&#xff08;divide-and-conquer&#xff09;策略&#xff08;分治法将问题分&#xff08;divide&#xff09;成一些小的问题然后递归求解&#xff0c;而…...

OSG3.6.5 + VS2017前期准备及编译

OSG3.6.5 VS2017前期准备及编译 1、前期准备 1.1、osg稳定版本源码 Stable releases (openscenegraph.com) 1.2、osg依赖项 Dependencies (openscenegraph.com) 1.3、osg测试及演示数据 Data Resources (openscenegraph.com) 1.4、安装doxygen和Graphviz&#xff08;用…...

IPv6 over IPv4隧道配置举例

配置IPv6 over IPv4手动隧道示例 组网需求 如图1所示&#xff0c;两台IPv6主机分别通过SwitchA和SwitchC与IPv4骨干网络连接&#xff0c;客户希望两台IPv6主机能通过IPv4骨干网互通。 图1 配置IPv6 over IPv4手动隧道组网图 配置思路 配置IPv6 over IPv4手动隧道的思路如下&…...

【GitOps系列】使用 ArgoCD 快速打造GitOps工作流

文章目录 ArgoCD简介ArgoCD安装访问ArgoCDGitOps 工作流总览创建 ArgoCD 应用检查 ArgoCD 同步状态访问应用 连接 GitOps 工作流体验 GitOps 工作流生产建议1&#xff09;修改默认密码2&#xff09;配置 Ingress 和 TLS3&#xff09;使用 Webhook 触发 ArgoCD4&#xff09;将源…...

C#|无法打开cs文件设计窗口

报错信息&#xff1a;To prevent possible data loss before loading the designer, the following errors must be resolved: 解决方案&#xff1a;实不相瞒我把项目解决方案名称改短了就可以了。。有其他原因或者解决方案望不吝赐教。。...

【SpringBoot笔记36】SpringBoot自定义WebSocketHandler集成WebSocket

这篇文章,主要介绍SpringBoot自定义WebSocketHandler集成WebSocket。 目录 一、SpringBoot集成WebSocket 1.1、添加WebSocket依赖 1.2、自定义WebSocketHandler 1.3、注册WebSocket服务端...

flutter 图片相关

官方链接&#xff1a;https://api.flutter.dev/flutter/widgets/Image-class.html 图片基本使用 显示本地图片时,要在pubspec.yaml文件里面添加如:(注意空格) assets: - assets/images/logo.png Fit属性&#xff1a; BoxFit.cover最常用 显示可能拉伸&#xff0c;可能裁…...

将上位机程序从PC的window系统迁移至Intel NUC的无桌面版ubuntu系统问题记录

将上位机程序从PC的window系统迁移至Intel NUC的无桌面版ubuntu系统 问题一 网口失效 问题描述&#xff1a;NUC关机状态下&#xff0c;将网口与路由器连接&#xff0c;网络指示灯闪烁&#xff1b;NUC开机后&#xff0c;网络指示灯熄灭&#xff0c;使用ping命令&#xff0c;既…...

CHI中的error处理

Error Handling Error types 包含两种sub-packet级别的error, 和两种packe级别的error; Packet level error Data Error, DERR □ 访问的地址是正确的&#xff0c;但是访问的数据有错误&#xff1b;通常是在数据崩溃的时候使用&#xff0c;例如ECC&#xf…...

如何使用 PHP 进行数据库缓存处理?

当你想要让你的PHP应用程序更快时&#xff0c;数据库缓存是一个重要的工具。它可以帮助你避免频繁地查询数据库&#xff0c;提高应用程序的响应速度。不过&#xff0c;在进行数据库缓存处理时&#xff0c;需要注意一些细节&#xff0c;否则可能会得到相反的结果。下面&#xff…...

新版巨量广告投放技巧分析

新版广告系统&#xff0c;计划出价40&#xff0c;转化成本特别低只有21&#xff0c;同时消耗也比较慢 为什么刚开始成本都比较低&#xff0c;跑着跑着成本就高了&#xff0c;像这种情况一般如何操作&#xff1f; 一: 为什么会出现成本和出价差这么多 1&#xff1a; 系统对账…...

Vue3 导出excel

&#x1f642;博主&#xff1a;锅盖哒 &#x1f642;文章核心&#xff1a;导出excel 目录 首先&#xff0c;你需要安装xlsx库。可以使用npm或yarn来安装&#xff1a; 在Vue组件中&#xff0c;你可以使用xlsx库来生成Excel文件并提供一个导出按钮供用户下载。 在Vue 3中&…...

vue 使用vue-json-viewer 展示 JSON 格式的数据

npm install vue-json-viewer --save<el-button type"primary" click"previewClick">预览</el-button><el-dialog title"预览" :visible.sync"previewVisible" width"70%"><viewer ref"viewer&qu…...

14.python设计模式【模板方法模式】

内容&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法某特定步骤。 角色&#xff1a; 抽象类&#xff08;AbstractClass&#xff09;&#xff1a;定义抽象的原子操作&#xff08;钩子…...

谷粒商城第六天-实现功能的前序工作(网关的配置 跨域配置)

目录 一、为什么要做这项工作 1.1 为什么要配置网关 1.2 为什么要使用网关统一配置跨域 二、网关配置 三、统一跨域配置 四、总结 一、为什么要做这项工作 1.1 为什么要配置网关 我们知道网关的作用其实主要就是进行路由的&#xff0c;也就是根据前端发送到网关的请求&…...

为什么说国内数字孪生平台gis架构采用Cesium是不错的选择?

Gis作为数字孪生平台开发中重要的一环对数字孪生平台是否好用是一个重要的判定方式&#xff0c;国内数字孪生软件在融合GIS系统方面采取了多种方式&#xff0c;例如Unity或Unreal Engine等游戏引擎&#xff0c;以增强数字孪生的空间感知和空间分析能力&#xff0c;提供更全面、…...

前端面试的性能优化部分(1)每篇10题

1. 懒加载的概念 懒加载&#xff08;Lazy Loading&#xff09;是一种优化技术&#xff0c;它用于延迟加载页面资源&#xff0c;只在需要时才加载特定的内容&#xff0c;而不是在页面初始加载时一次性加载所有资源。懒加载的目的是提高页面加载速度和性能&#xff0c;尤其对于单…...

GitLab备份升级

数据备份(默认的备份目录在/var/opt/gitlab/backups/下&#xff0c;生成一个以时间节点命名的tar包。) gitlab-rake gitlab:backup:create新建repo源&#xff0c;升级新版本的gitlab vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] namegitlab-ce baseurlhttps://mirrors.…...

Matlab实现遗传算法仿真(附上40个仿真源码)

遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种基于生物进化理论的优化算法&#xff0c;通过模拟自然界中的遗传过程&#xff0c;来寻找最优解。 在遗传算法中&#xff0c;每个解被称为个体&#xff0c;每个个体由一组基因表示&#xff0c;每个基因是…...

git使用(由浅到深)

目录流程图 1. 分布式版本控制与集中式版本控制 1.1 集中式版本控制 集中式版本控制系统有:CVS和SVN它们的主要特点是单一的集中管理的服务器&#xff0c;保存所有文件的修订版本&#xff1b;协同开发人员通过客户端连接到这台服务器&#xff0c;取出最新的文件或者提交更新…...

通用异步导出服务设计:从业务功能到平台基础能力的抽象

在后台管理系统中&#xff0c;“导出 Excel”几乎是一个绕不开的功能。看似只是点击一个按钮、下载一个文件&#xff0c;背后却经常隐藏着性能、稳定性、安全性和用户体验问题。 当数据量较小时&#xff0c;同步导出通常可以满足需求。但随着业务数据规模增长&#xff0c;导出操…...

共聚焦vs触针 :表面粗糙度测量原理及ISO25178兼容性分析

表面粗糙度测量是精密制造和质量控制的核心环节&#xff0c;直接影响产品耐磨性、摩擦性能及使用寿命。在工业和科研应用中&#xff0c;准确测量Ra参数不仅保证零件性能稳定&#xff0c;还满足ISO25178标准和ISO4287标准等国际标准要求。传统触针仪器虽然精度高&#xff0c;但操…...

利用python计算

#题1&#xff1a;11/21/31/4...1/100sum1 0for i in range(1, 101):sum1 1 / iprint("题1结果:", sum1)# 题2&#xff1a;计算1 - 1/2 1/3 - 1/4 ... 1/nn 100 sum2 0for i in range(1, n1):# 奇数项加&#xff0c;偶数项减if i % 2 1:sum2 1 / ielse:sum2…...

3个核心操作:让网络架构可视化变得如此简单

3个核心操作&#xff1a;让网络架构可视化变得如此简单 【免费下载链接】easy-topo vuesvgelement-ui 快捷画出网络拓扑图 项目地址: https://gitcode.com/gh_mirrors/ea/easy-topo 在数字时代的网络管理中&#xff0c;技术文档的可视化呈现已经成为专业沟通的关键。面对…...

10分钟掌握XGBoost:机器学习竞赛的终极梯度提升库

10分钟掌握XGBoost&#xff1a;机器学习竞赛的终极梯度提升库 【免费下载链接】xgboost Scalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM) Library, for Python, R, Java, Scala, C and more. Runs on single machine, Hadoop, Spark, Dask, Flink a…...

如何在Mayo中使用剪辑平面和爆炸视图:复杂装配体分析利器

如何在Mayo中使用剪辑平面和爆炸视图&#xff1a;复杂装配体分析利器 【免费下载链接】mayo 3D CAD viewer and converter based on Qt OpenCascade 项目地址: https://gitcode.com/gh_mirrors/ma/mayo Mayo是一款功能强大的开源3D CAD查看器和转换器&#xff0c;基于Q…...

宏裕塑胶代理沙伯基础创新SABIC(原GE塑料)全线工程塑料产品与技术服务

宏裕塑胶依托源头直采模式&#xff0c;整合沙伯基础创新 SABIC&#xff08;原 GE 塑料&#xff09;等国际一线品牌工程塑料原料&#xff0c;为制造业企业提供高性价比、稳定可控的供应链解决方案&#xff0c;助力客户降本增效&#xff0c;适用于汽车零配件、精密电子、注塑生产…...

SABIC塑料解决方案:宏裕塑胶全面代理原GE塑料高性能材料产品

宏裕塑胶依托源头直采优势整合沙伯基础创新SABIC等国际品牌资源&#xff0c;为制造业客户提供高性价比通用工程塑料原料及全流程技术支撑&#xff0c;助力企业降本增效。其代理产品涵盖PETG、PCTG、PBT、TPEE等全品类工程塑料&#xff0c;专为塑胶制品厂、汽车零部件厂等客户群…...

今日算法(构造二叉搜索树)

题目描述给你一个整数数组 nums&#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡 二叉搜索树&#xff08;BST&#xff09;。平衡二叉搜索树&#xff1a;左右两个子树的高度差的绝对值不超过 1每个节点的左右子树都是平衡二叉树二叉搜索树的中序遍历结…...

CSDN热门文章评论区运营心法——从技术答疑到社区共建的进阶之路

评论区&#xff0c;是技术内容的第二战场。你发出去的文章只是第一招&#xff0c;真正的对话从这里开始。 引言&#xff1a;为什么评论区是"第二战场" 技术写作圈有个不成文的共识&#xff1a;文章发出去&#xff0c;战斗才刚开始。 很多人把写完文章当成终点&…...