排序进行曲-v3.0

news2024/12/28 20:46:19

文章目录

  • 小程一言
    • 归并排序
      • 步骤
      • 举例
        • 总结
        • 时间复杂度分析:
        • 空间复杂度分析:
        • 注意
      • 应用场景
        • 总结
      • 实际举例
          • Other
      • 代码实现
        • 结果
        • 解释

小程一言

这篇文章是在排序进行曲2.0之后的续讲,
这篇文章主要是对归并排序进行细致分析,以及操作。
希望大家多多支持

图片: Alt

归并排序

归并排序是一种分治算法,它将一个待排序的数组分成两个子数组,分别对这两
	个子数组进行排序,然后再将
两个有序的子数组合并为一个有序的数组。这个过程不断地递归进行,直到最后
	将整个数组排序完成。

步骤

分割(Divide):将待排序的数组不断地二分,直到分成单个元素的子数组。这个过程可以通过递归实现。递
	归的终止条件是数组的长度为1。

合并(Merge):将相邻的两个有序子数组合并为一个有序的子数组。合并的方法是比较两个子数组的第一个元
	素,将较小的元素放在新的子数组中,并将该元素从原子数组中移除。然后继续比较两个子数组的新的第
	一个元素,重复这个过程,直到其中一个子数组为空。将剩余的另一个子数组直接拼接到新的子数组的
	末尾。

递归合并(Recursive Merge):对每个单个元素的子数组进行排序和合并。当子数组长度为1时,它已经是有
	序的,直接返回该子数组即可。对于长度大于1的子数组,先将其分割成两个子数组,然后分别对这两个子
	数组进行递归合并,得到两个有序的子数组。最后将这两个有序的子数组进行合并,得到一个更大的有序
	子数组。

举例

假设我们要对数组 [5, 3, 8, 2, 9, 1] 进行排序。

分割(Divide):首先将数组分成两个子数组,即 [5, 3, 8] 和 [2, 9, 1]。

递归合并(Recursive Merge):对两个子数组分别进行递归合并排序。首先对 [5, 3, 8] 进行递归合并排序,
	得到有序子数组 [3, 5, 8]。然后对 [2, 9, 1] 进行递归合并排序,得到有序子数组 [1, 2, 9]。

合并(Merge):将两个有序子数组 [3, 5, 8] 和 [1, 2, 9] 进行合并。比较两个子数组的第一个元素,将
	较小的元素放入新的子数组中,并将该元素从原子数组中移除。依次比较,得到新的子数组
	 [1, 2, 3, 5, 8, 9]。

最终,整个数组 [5, 3, 8, 2, 9, 1] 经过归并排序后,得到有序数组 [1, 2, 3, 5, 8, 9]。

总结

这个例子展示了归并排序的过程,通过不断地分割和合并子数组,最终将整个数组排序。在每一次合并过程中,
	我们都是将两个有序的子数组合并为一个有序的子数组,这保证了最终得到的整个数组是有序的。

图片: ![Alt](https://img-home.csdnimg.cn/images/20220524100510.png
)### 复杂度分析

归并排序的时间复杂度为 O(nlogn),空间复杂度为 O(n)。

时间复杂度分析:


分割(Divide):每次将数组分割成两个子数组,分割的时间复杂度为 O(logn)。因为每次分割都将数组的大
	小减半,所以需要进行 logn 次分割。
合并(Merge):对于每一次合并操作,需要比较两个子数组的元素并将较小的元素放入新的子数组中,合并的
	时间复杂度为 O(n)。因为每次合并都是将两个子数组的元素全部比较一遍,所以需要进行 n 次合并。
递归合并(Recursive Merge):对于长度为 n 的数组,需要进行 logn 次递归合并,每次递归合并的时间
	复杂度为 O(n)。所以总的时间复杂度为 O(nlogn)。

空间复杂度分析:

在每次递归合并的过程中,需要创建临时数组来存储合并后的子数组,临时数组的空间复杂度为 O(n)。
在每次递归合并完成后,临时数组会被销毁,所以整个归并排序的空间复杂度为 O(n)。

注意

归并排序是一种稳定的排序算法,因为在合并的过程中,如果两个元素相等,我们会先将左边的元素放入新的
	子数组中,这样可以保持原始数组中相等元素的相对顺序不变。

应用场景

排序问题:归并排序可以用于对数组、链表等数据结构进行排序。它的时间复杂度为O(nlogn),在处理大规模
	数据集时表现较好。

大规模数据的排序:归并排序适用于需要对大规模数据进行排序的场景。由于归并排序是一种分治算法,可以
	将大规模数据分割成较小的子问题进行排序,然后再将排序好的子问题合并起来。

外部排序:归并排序是一种适用于外部排序的算法。外部排序是指需要处理的数据量大于计算机内存容量,需
	要将数据存储在外部存储介质(如硬盘)中进行排序。归并排序的特点是每次只需要读取一部分数据到内
	存中进行排序,然后将排序好的数据写回外部存储介质。

并行计算:归并排序可以通过并行计算的方式提高排序的效率。由于归并排序的分治特性,可以将大规模数据
	分割成多个子问题进行排序,然后再将排序好的子问题合并起来。这种并行计算的方式可以利用多核处理
	器或分布式计算环境来加速排序过程。

在这里插入图片描述

总结

归并排序适用于排序问题,特别是大规模数据的排序和外部排序场景。它具有稳定的时间复杂度和较好的并行
	性能,因此在实际应用中被广泛使用。

实际举例

数组排序:归并排序可以用于对数组进行排序。例如,给定一个整数数组,可以使用归并排序将数组中的元素
	按照升序进行排序。

链表排序:归并排序也可以用于对链表进行排序。例如,给定一个链表,可以使用归并排序将链表中的节点按
	照升序进行排序。

文件排序:归并排序可以用于对大规模文件进行排序。例如,当需要对一个非常大的文件进行排序时,可以使
	用归并排序算法将文件分割成多个较小的部分,分别对这些部分进行排序,然后再将排序好的部分合并起
	来。

数据库排序:归并排序可以用于对数据库中的数据进行排序。例如,在某个数据库表中有大量的数据需要按照
	某个字段进行排序,可以使用归并排序算法将数据分割成多个较小的部分,分别对这些部分进行排序,然
	后再将排序好的部分合并起来。

外部排序:归并排序是一种适用于外部排序的算法。外部排序是指需要处理的数据量大于计算机内存容量,需
	要将数据存储在外部存储介质(如硬盘)中进行排序。归并排序的特点是每次只需要读取一部分数据到内
	存中进行排序,然后将排序好的数据写回外部存储介质。


在这里插入图片描述

Other
这些例子只是归并排序在实际中的一些应用,实际上归并排序的思想和方法也可以应用于其他问题,只需要将
	问题分割成更小的子问题,并将子问题的结果合并起来。

代码实现

public class MergeSort {
    public static void mergeSort(int[] arr) {
        if (arr == null || arr.length <= 1) {
            return;
        }
        int[] temp = new int[arr.length];
        mergeSort(arr, 0, arr.length - 1, temp);
    }

    private static void mergeSort(int[] arr, int start, int end, int[] temp) {
        if (start >= end) {
            return;
        }
        int mid = start + (end - start) / 2;
        mergeSort(arr, start, mid, temp);
        mergeSort(arr, mid + 1, end, temp);
        merge(arr, start, mid, end, temp);
    }

    private static void merge(int[] arr, int start, int mid, int end, int[] temp) {
        int left = start;
        int right = mid + 1;
        int index = start;
        while (left <= mid && right <= end) {
            if (arr[left] <= arr[right]) {
                temp[index++] = arr[left++];
            } else {
                temp[index++] = arr[right++];
            }
        }
        while (left <= mid) {
            temp[index++] = arr[left++];
        }
        while (right <= end) {
            temp[index++] = arr[right++];
        }
        for (int i = start; i <= end; i++) {
            arr[i] = temp[i];
        }
    }

    public static void main(String[] args) {
        int[] arr = {5, 2, 8, 4, 9, 1, 3, 7, 6};
        mergeSort(arr);
        System.out.println("Sorted array: " + Arrays.toString(arr));
    }
}

在这里插入图片描述

结果

运行以上代码,输出结果为:Sorted array: [1, 2, 3, 4, 5, 6, 7, 8, 9],表示归并排序对给定的数组
	进行了升序排序。

解释

在mergeSort方法中,首先判断数组的长度是否小于等于1,如果是,则直接返回。然后创建一个临时数组
	temp,并调用mergeSort方法对数组进行递归排序。在mergeSort方法中,首先计算出数组的中间位置
	mid,然后分别对左半部分和右半部分进行递归排序,最后调用merge方法将排序好的左右两部分合并起
	来。在merge方法中,使用双指针分别指向左半部分和右半部分的起始位置,比较两个指针所指的元素大
	小,将较小的元素放入临时数组temp中,并将对应指针向后移动一位。最后将临时数组temp中的元素复制
	回原数组arr中,完成排序。

图片: Alt

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

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

相关文章

机器学习---概述(一)

文章目录 1.人工智能、机器学习、深度学习2.机器学习的工作流程2.1 获取数据集2.2 数据基本处理2.3 特征工程2.3.1 特征提取2.3.2 特征预处理2.3.3 特征降维 2.4 机器学习2.5 模型评估 3.机器学习的算法分类3.1 监督学习3.1.1 回归问题3.1.2 分类问题 3.2 无监督学习3.3 半监督…

平时工资不够用?推荐4种适合工作之余做的兼职副业!

你是否也曾经在为每个月的工资发愁&#xff1f;你是否想过做点副业来增加收入&#xff1f;现在很多上班族的工资&#xff0c;已经难以满足他们的生活需求了&#xff0c;很多人开始尝试通过副业来增加收入。那么上班族要如何寻找适合自己的副业呢&#xff1f;下面就给大家分享几…

Docker 网络模型使用详解 (1)Dockers网络基础

目录 环境准备 Dockers 网络基础 1.端口映射 查看随机映射端口范围 -p可以指定映射到本地端口 映射指定地址和指定端口 映射指定地址 宿主机端口随机分配 指定传输协议 端口暴露 容器互联 自定义网络 现在把container7加入到demo_net中 在启动一个容器加入到demo_net…

C++封装思想之一:封装(1.8W字详解)

目录 C封装 封装 封装的作用&#xff1a; C的封装 VS C封装&#xff1a; C语言&#xff1a; C语言&#xff1a; 类和对象 类的声明 权限修饰符&#xff1a;public、private&#xff08;set/get&#xff09;、protected 构造函数 默认构造函数&#xff08;无参构造函数…

服务器安装系统教程

虽然装好了显卡&#xff0c;但是机器运行一会&#xff0c;CPU就飙升到100%。找售后解决&#xff0c;也没有完全解决。所以这次试试换个别的系统是否能修复。 本来计划是后面组raid、重装系统的&#xff0c;得&#xff0c;又提前了。 这里说一下&#xff0c;这个流程未必是最好…

AI + 办公,超哇塞的5款办公神器!

一个好用的软件可以让我们节省时间&#xff0c;提高办公效率&#xff0c;小编就和大家分享5款提高办公效率的好软件&#xff0c;每一个都可以称作神器&#xff0c;最后一个绝了。 在数字化的时代&#xff0c;人工智能技术正在迅速地改变着我们的生活和工作方式。 当今社会&am…

加速国产化进程 | 重建大师精准满足信创替代需求

“信创”&#xff1a;即信息技术应用创新产业&#xff0c;旨在通过实现信息技术领域的自主可控&#xff0c;保障国家信息安全。 《“十四五”国家信息化规划》等国家政策中多次强调数据安全的重要性&#xff0c;明确要求到2025年行政办公及电子政务系统全部完成国产化替代&…

HTTPS实现原理

https是基于http和SSL/TLS实现的一个协议&#xff0c;他可以保证在网络上传输的数据都是加密的&#xff0c;从而保证数据安全。 接下来我们从http协议开始&#xff0c;提出想法并逐步进行分析&#xff0c;最终实现Https。 1. http协议是不安全的。 在https诞生之前&#xff…

Flink之RedisSink

在Flink开发中经常会有将数据写入到redis的需求,但是Flink官方并没有对应的扩展包,这个时候需要我们自己编译对应的jar资源,这个时候就用到了bahir,barhir是apahce的开源项目,是专门给spark和flink提供扩展包使用的,bahir官网,这篇文章就介绍下如何自己编译RedisSink扩展包. 下…

【word技巧】如何做到,批量保存word文档图片

Word文件中有很多图片都需要保存&#xff0c;除了一张张的进行图片另存为以外&#xff0c;我们还有其他方法可以批量一次性保存word文档中的图片嘛&#xff1f;今天分享两个方法&#xff0c;批量保存word文档图片。 方法一&#xff1a; 将文件进行另存为&#xff0c;在选择路…

Java版工程行业管理系统源码-专业的工程管理软件-em提供一站式服务

​ Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目…

回归分析书籍推荐

回归分析在线免费书籍&#xff1a;I 1-ntroduction to Regression Methods for Public Health using R Introduction to Regression Methods for Public Health Using R 2-An Introduction to Statistical Learning https://hastie.su.domains/ISLR2/ISLRv2_website.pdf 可以…

安达发制造工业迈向智能化:APS高级计划排程助力提升生产效率

随着市场竞争的加剧&#xff0c;制造企业纷纷寻求提高生产效率和降低成本的方法。近年来&#xff0c;越来越多的制造企业开始采用APS(高级计划与排程)系统&#xff0c;以优化生产计划和排程&#xff0c;提高生产效率&#xff0c;并在竞争中取得优势。 现代制造业通常面临复杂的…

React diff 根据相对位置的 diff 算法

文章目录 diff 算法没有 key 时的diff通过 key 的 diff查找需要移动的节点移动节点添加新元素移除不存在的元素缺点 diff 算法 没有 key 时的diff 根据新旧列表的长度进行 diff 公共长度相同的部分直接patch新列表长度>旧列表长度则添加&#xff0c;否则删除 function pa…

yo!这里是STL::vector类简单模拟实现

目录 前言 重要接口模拟实现 默认成员函数 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值运算符重载 迭代器 简单接口 1.size() 2.capacity() 3.swap() 操作符重载 1.操作符[] 扩容接口 1.reserve() 2.resize() 增删查改接口 1.push_back() 2.pop_back() …

vue页面布局

布局 用element-plus自带的布局&#xff1b; 左边菜单 用他的Menu 菜单、自带收缩和展开&#xff1b;数据可以接口获取或者写死&#xff1b; 使用的如下操作、把主题和默认打开的index存到缓存中 头部&#xff1b; 简单的先分成左右&#xff1b;再简单的分成左右 1、左…

CS 144 Lab Four -- the TCP connection

CS 144 Lab Four -- the TCP connection TCPConnection 简述TCP 状态图代码实现完整流程追踪 测试 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Three 对应的PDF: Lab Checkpoint 4: down the stack (the network interface) TCPConnection 简述 TCPConnection 需…

Python系统学习1-3-变量,运算符

1、变量 变量&#xff1a;关联一个对象的标识符 学习目标&#xff1a;学会画变量的内存图 命名规则:字母数字下划线&#xff0c;所有单词小写&#xff0c;单词之间下划线隔开 赋值&#xff1a;创建一个变量或改变一个变量关联的数据。 语法&#xff1a;变量名数据&#xf…

vue运行在IE浏览器空白报错SCRIPT1006: 缺少‘)‘ -【vue兼容IE篇】

其他浏览器均正常&#xff0c;但是切换ie模式&#xff0c;打开空白&#xff0c;F12打开报错缺少‘)‘ &#xff0c;如下图 在搜狗浏览器下点开报错&#xff1a;定格在crypto-js处 解决&#xff1a; 步骤一&#xff1a;使用npm安装babel-polyfill 依赖&#xff08;已安装了可忽…

Java与Kotline Funcation函数与参数函数的详解

一.介绍 在现在以IDE为开发工具的时代&#xff0c;各种开发语言都有&#xff0c;kotlin的语法势头比较强&#xff0c;今天我们将介绍在项目中出现比较多的两种函数&#xff0c;一种是参数函数&#xff0c;还有一种就是Function函数 如果你不了匿名函数请阅读以下文档&#xff…