排序-归并排序(merge sort)

归并排序(Merge Sort)是一种分而治之的算法,它将原始数组分成越来越小的子数组,直到每个子数组只有一个元素,然后将这些子数组两两合并,过程中保持排序状态,最终合并成一个完全有序的数组。归并排序是一种稳定的排序算法,其主要特点是效率高且易于理解。

归并排序的基本步骤:

  1. 分解:将当前区间一分为二,即求中点。
  2. 递归排序:递归地对两个子区间a[low...mid]和a[mid+1...high]进行归并排序。
  3. 合并:将已排序的两个子区间合并成一个有序区间。

时间复杂度和空间复杂度:

  • 时间复杂度:归并排序的时间复杂度为O(n log n),无论是最好、最坏还是平均情况都是如此,因为它总是将数组分成两半进行处理,然后合并,这个过程与数组的初始状态无关。

  • 空间复杂度:由于归并排序需要一个与原数组相同大小的临时数组来合并子数组,所以其空间复杂度为O(n)。

稳定性**:

归并排序是稳定的排序算法,因为在合并两个子数组时,如果遇到相等的元素,会先将左侧子数组的元素加入结果数组,保持原有顺序不变。

以下是归并排序的实现示例图:

以下是实现归并排序的Java代码:

public class MergeSort {// 合并两个子数组private static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left, j = mid + 1, k = 0;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}// 将排序后的元素复制回原数组System.arraycopy(temp, 0, arr, left, right - left + 1);}// 主函数,递归进行归并排序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); // 合并两个有序部分}}public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6, 7};int[] temp = new int[arr.length];mergeSort(arr, 0, arr.length - 1, temp);System.out.println("Sorted array: ");for (int num : arr) {System.out.print(num + " ");}}
}

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

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

相关文章

《一》Word文字编辑软件---架构设计分析

1&#xff0c;简单介绍 今天&#xff0c;我们来模拟offic软件中的word文档&#xff0c;运行如图&#xff1a; 运行程序后会出现主界面&#xff0c;顶端的菜单栏包括“文件”“编辑”“格式”“窗口”和“帮助五个主菜单。 菜单栏下面是工具栏&#xff0c;包含了系统常用的功能按…

如何判断海外住宅ip的好坏?

在海外IP代理中&#xff0c;住宅IP属于相对较好的资源&#xff0c;无论是用于工作、学习、还是娱乐&#xff0c;都能得到较好的使用效果。作为用户&#xff0c;该如何判断海外住宅IP的好坏呢&#xff1f; 稳定性与可靠性&#xff1a;海外住宅IP相比动态IP地址&#xff0c;通常具…

Java全局异常处理,@ControllerAdvice异常拦截原理解析【简单易懂】

https://www.bilibili.com/video/BV1sS411c7Mo 文章目录 一、全局异常处理器的类型1-1、实现方式一1-2、实现方式二 二、全局异常拦截点2-1、入口2-2、全局异常拦截器是如何注入到 DispatcherServlet 的 三、ControllerAdvice 如何解析、执行3-1、解析3-2、执行 四、其它4-1、设…

电脑提示找不到ffmpeg.dll无法继续执行代码怎么办?

电脑提示找不到找不到ffmpeg.dll无法继续执行代码怎么办&#xff0c;有什么好的解决办法&#xff0c;出现这样的弹出就会导致软件无法打开或者是异常关闭&#xff0c;找不到dll文件&#xff0c;是一个非常重要的电脑使用问题&#xff0c;会给使用者带来许多的麻烦。那么找不到d…

LeetCode746:使用最小花费爬楼梯

题目描述 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 请你计算并返回达到楼梯顶部的最低花费。 代码 …

MongoDB和AI 赋能行业应用:制造业和汽车行业

欢迎阅读“MongoDB和AI 赋能行业应用”系列的第一篇。 本系列重点介绍AI应用于不同行业的关键用例&#xff0c;涵盖制造业和汽车行业、金融服务、零售、电信和媒体、保险以及医疗保健行业。 随着人工智能&#xff08;AI&#xff09;在制造业和汽车行业的集成&#xff0c;传统…

CDN的工作原理及流程

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是一种构建在数据网络上的分布式内容分发网络。 CDN利用全局负载均衡技术&#xff0c;将用户的访问请求指向离用户最近且工作正常的流媒体服务器上&#xff0c;由流媒体服务器直接响应用户的请求…

Tableau学习2.0版——复习

官网下载链接&#xff1a;https://www.tableau.com/zh-cn/support/releases 学生账户申请链接&#xff1a;https://www.tableau.com/zh-cn/academic/students。直接去学信网下载学籍在线验证作为申请证明。 目录 1、可视化原理 2、基础图表制作 2.1 对比分析&#xff08;比…

@游戏行业er!MongoDB广州线下沙龙邀您报名!

随着游戏和应用程序的发展&#xff0c;数据变得越来越重要。在为您的下一个游戏选择数据库时&#xff0c;数据库管理者常常会面对灵活性、可扩展性、可靠性、运营效率等问题或挑战。 MongoDB在游戏开发领域有着广泛的应用&#xff0c;灵活数据模型可以存储和处理各种类型的数据…

JPA ENTITY EXTEND

1. Overview Relational databases don’t have a straightforward way to map class hierarchies onto database tables. To address this, the JPA specification provides several strategies: MappedSuperclass – the parent classes, can’t be entitiesSingle Table …

webpack处理js和css模块化导入导出示例:

webpack默认并不能处理js模块化的导入和导出,依赖于ts-loader和babel-loader webpack.config,js module.exports {entry: ./src/index.ts,output: {filename: main.js,},mode: development, // 或者 productionmodule: {rules: [{test: /\.ts/,exclude: /(node_modules)/,use:…

二维平移矩阵 (2D translate matrix)

2D translate matrix 推荐阅读正文推荐阅读 矢量旋转矩阵 正文 之前我们介绍了矢量旋转矩阵的形式,这里我们来介绍一下平移矩阵的形式。比如,我们我们有一个点,其坐标为 (0,1)。那么我们如何操作才能够将这个点沿着 x 轴正方向平移 1 个单位长度呢? 这里我们以向右移动…

vj题单 P4552 [Poetize6] IncDec Sequence

思路&#xff1a; 一次操作&#xff1a;选一个区间[l, r]&#xff0c;把这个区间的数都加1或者都减1&#xff0c;可以将求该数列的差分数组b然后来进行该操作 一次操作的两种种情况&#xff1a;&#xff08;l可以等于r&#xff09; 1.b[l]1 b[r1]-1 2.b[l]-1 b[r1]1 Q1:…

PHP 提取数组中的特定的值

需求&#xff1a; 前端展示&#xff1a; &#xff08;1&#xff09;之前的页面&#xff1a; &#xff08;2&#xff09;修改后的页面&#xff1a; 之前接口返回的数据 &#xff1a; 解决办法&#xff1a;提取tags 中的 ’约 的数组 添加到一个新的数组中去 1&#xff1a;一开…

【CPP】多线程并发—— Mutex 和 Lock

#include <iostream> #include <thread> #include <mutex> #include "my_utils.h"std::mutex mtx; // 全局互斥锁 int shared_data 0; // 共享数据 void increment() { for (int i 0; i < 10; i) { std::cout <<"incre…

2024年去除视频水印的5种方法

如果你从事电影剪辑或者视频编辑工作&#xff0c;你经常需要从优酷、抖音、TikTok下载各种视频片段……。 通常这些视频带有水印和字幕。一些免费软件如CapCut、canva、Filmora也会给你制作的视频打上水印&#xff0c;这些水印嵌入在视频内部。 2024年去除视频水印的5种方法 …

Mysql-用户变量的声明与使用

#声明变量 #1.标识符不能以数字开头 #2.只能使用_或$符号&#xff0c;不能使用其他符号 #3.不能使用系统关键字 setuserName刘德华; select userName:刘青云;#将赋值与查询结合 #查询变量、使用变量&#xff0c;匿名的时候建议加上as select userName as 读取到的userName变量…

Golang面向对象编程(二)

文章目录 封装基本介绍封装的实现工厂函数 继承基本介绍继承的实现字段和方法访问细节多继承 封装 基本介绍 基本介绍 封装&#xff08;Encapsulation&#xff09;是面向对象编程&#xff08;OOP&#xff09;中的一种重要概念&#xff0c;封装通过将数据和相关的方法组合在一起…

java JOptionPane 介绍

JOptionPane是Java Swing库中的一个类,用于创建对话框(Dialogs),以便与用户进行交互。它提供了一种简单的方式来显示消息、警告、错误、输入框等。 主要方法: showMessageDialog(Component parentComponent, Object message):显示一个包含消息的对话框。showInputDialog…

2024OD机试卷-手机App防沉迷系统 (java\python\c++)

题目:手机App防沉迷系统 题目描述 智能手机方便了我们生活的同时,也侵占了我们不少的时间。 “手机App防沉迷系统”能够让我们每天合理地规划手机App使用时间,在正确的时间做正确的事。 它的大概原理是这样的: 在一天24小时内,可以注册每个App的允许使用时段一个时间段只…