【排序4】探秘归并排序:提高程序效率的必备技巧

news2024/11/15 13:49:36

😊归并排序

  • 🎊1、基本思想
  • 🎊2、代码示例
  • 🎊3、非递归实现
  • 🎊4、归并排序的性能分析
  • 🎊5、归并排序的优缺点
  • 🎊6、归并排序的应用场景
  • 🎊7、总结

🎊1、基本思想

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

🔍归并排序的实现可以分为两个主要步骤:分解合并
分解:将待排序序列平均分成两个子序列,递归地对子序列进行分解,直到子序列的长度为1(此时子序列已经有序)。
合并:将两个有序子序列合并成一个新的有序序列。合并操作从两个子序列的起始位置开始,比较两个子序列的当前元素,将较小的元素放入新序列中,并将该元素所在子序列的指针向后移动一位。重复此过程,直到一个子序列的所有元素都被放入新序列中。然后将另一个子序列的剩余元素依次放入新序列中。

合并如图
在这里插入图片描述

🎊2、代码示例

public static void mergeSort(int[] array) {
        mergeFunc(array,0,array.length-1);
}

private static void mergeFunc(int[] array,int left,int right) {
	if(left >= right) {
		return;
    }
    int mid = left + ((right-left) >> 1);
    mergeFunc(array,left,mid);
    mergeFunc(array,mid+1,right);
    //左边分解完,右边分解完,开始合并
    merge(array,left,mid,right);
}

private static void merge(int[] array,int left,int mid,int right) {
	int s1 = left;
    int e1 = mid;
    int s2 = mid+1;
    int e2 = right;
    int[] tmpArr = new int[right-left+1];
    int k = 0;
    //1.保证两个表 都有数据
    while (s1 <= e1 && s2 <= e2) {
		if(array[s1] <= array[s2]) {
			tmpArr[k++] = array[s1++];
        }else {
            tmpArr[k++] = array[s2++];
        }
	}
	//2. 看哪个数组 还有数据 拷贝回去
    while (s1 <= e1) {
		tmpArr[k++] = array[s1++];
	}
    while (s2 <= e2) {
		tmpArr[k++] = array[s2++];
    }
    //3.拷贝到源数组
    for (int i = 0; i < k; i++) {
	}
}

🎊3、非递归实现

public static void mergeSortNor(int[] array) {
	int  gap = 1;
    //最外层循环 控制组数
    while (gap < array.length) {
		//每一组进行排序
        for (int i = 0; i < array.length; i = i+2*gap) {
        	int left = i;
        	int mid = left + gap-1;
        	if(mid >= array.length) {
			mid = array.length-1;
        	}
        	int right = mid+gap;
        	if(right >= array.length) {
        	right = array.length-1;
			}
        	merge(array,left,mid,right);
		}
		gap *= 2;
	}
}

🎊4、归并排序的性能分析

归并排序的时间复杂度为O(nlogn),其中n为待排序序列的长度。这是因为归并排序每次都将序列分成两半,需要递归logn次。每次合并操作需要遍历所有元素,因此总的时间复杂度为O(nlogn)。归并排序的空间复杂度为O(n),因为合并操作需要额外的空间来存储新序列。

🎊5、归并排序的优缺点

👻归并排序的优点包括:
1、稳定性:归并排序是一种稳定的排序算法,即相同元素的相对顺序在排序过程中不会改变。
2、时间复杂度:归并排序的时间复杂度为O(nlogn),在处理大量数据时具有较高的性能

🎉归并排序的缺点包括:
1、空间复杂度:归并排序的空间复杂度为O(n),需要额外的空间来存储新序列。在内存受限的情况下,这可能会成为一个问题。

🎊6、归并排序的应用场景

归并排序在许多领域都有广泛的应用,例如:

1、外部排序:在处理大量数据且内存受限的情况下,归并排序是一种有效的外部排序算法。它可以将数据分成多个小块,分别排序后再合并。
2、数据库系统:数据库系统在进行数据查询、排序和索引时,经常使用归并排序来提高性能。
3、大数据处理:在处理大规模数据集时,归并排序可以与其他算法(如MapReduce)结合使用,实现高效的数据处理和分析。

🎊7、总结

🥳

  1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(N)
  4. 稳定性:稳定

🎉OK!今天的分享就到这里了,后面还会分享更多算法,敬请关注喔!!!✌️
在这里插入图片描述
我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2jk117zkpgaoo

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

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

相关文章

ssh异常报错:Did not receive identification string from

一、问题描述 某次外出在异地工作场所xshell炼乳远程服务器时&#xff0c;报错&#xff1a;Connection closed by foreign host. D&#xff0c;服务器查看secure日志或sshd服务状态会显示&#xff1a;id not receive identification string from client_ip; 二、分析处理 1&a…

J9数字论:什么是公链、联盟链、私有链?它们之间区别在哪?

公有链是任何人都能参与读取、交易、写入的区块链&#xff0c;完全去中心化&#xff0c;账本信息公开透明&#xff0c;不受任何机构控制。公有链一般都需要挖矿来达成共识&#xff0c;因此带来了交易延时高、成本高和效率低等缺点。公有链的典型代表有比特币、以太坊、EOS等。私…

Vite学习指南

那本课程都适合哪些人群呢&#xff1f; 想要学习前端工程化&#xff0c;在新项目中投入使用 Vite 构建工具的朋友 Webpack 转战到 Vite 的小伙伴 前端架构师们&#xff0c;可以充实自己的工具箱 当然如果你没有项目相关开发经验&#xff0c;也可以从本课程中受益&#xff0…

你应该知道的GNU C语句表达式

许多写C语言的同道们或许都知道C语言中的表达式和语句&#xff0c;一般常见的语句都是在表达式后跟分号做结尾。例如&#xff0c; a 10 /*赋值表达式*/a 10; /*赋值语句*/当然语句不止有这一种&#xff0c;暂不过多引入。 我们都知道有些表达式是有其值的&#xff0c;例如上…

查询redis路径,清除redis缓存

查询redis路径 1、执行ps -ef | grep redis 命令&#xff0c;结果如下&#xff08;记住PID&#xff09; 2、执行ps -u 系统用户名&#xff0c;进一步确定进程id, 我这里的系统用户名是root&#xff0c;执行ps -u root&#xff0c;结果如下&#xff1a; 结合1的操作结果图可知…

taro3 + vue3 + ts 跨平台体验记录

taro3 vue3 ts 跨平台体验记录&#xff0c;根据进度不定期更新。 目标平台包含&#xff1a;H5、微信小程序、APP。开发环境&#xff1a;windows 安装cli【官方安装文档】 npm install -g tarojs/cli常用命令 // 查看taro版本 npm info tarojs/cli创建demo项目 taro init…

个体诊所电子处方系统设计,社区门诊处方开单管理系统软件教程

个体诊所电子处方系统设计&#xff0c;社区门诊处方开单管理系统软件教程 一、前言 以下软件程序操作教程以 佳易王诊所电子处方管理系统软件V17.3为例说明 如图&#xff0c;在基本信息设置里&#xff0c;可以设置处方配方模板&#xff0c;这样在开电子处方的时候可以一键导入…

C++中map和set的使用

&#xff08;图片来源于网络&#xff09; &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶…

插槽(64-67)

文章目录 插槽1.插槽 - 默认插槽(组件内可以定制一处结构)2.插槽 - 后备内容&#xff08;默认值&#xff09;3.插槽 - 具名插槽(组件内可以定制多处结构)4.作用域插槽(插槽的一个传参语法) 插槽 插槽分类:默认插槽和具名插槽 1.插槽 - 默认插槽(组件内可以定制一处结构) 作用…

JavaEE-微服务-Vuex

Vuex 2.1 什么是Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 Vuex在组件之间共享数据。 2.2 使用 vue cli 构建项目 2.3 入门案例 2.3.1 定义数据 export default new Vuex.Store({state: { // 状态区域&#xff08;定义变量区域&#xff09;user: ,toke…

table用position: sticky固定多层表头,滑动滚动条border边框透明解决方法

问题&#xff1a;我们发现&#xff0c;只要设置了border边框&#xff0c;这个位置滑动有内容经过就会出现如图的情况。 解决的方法&#xff1a;用outline&#xff08;轮廓&#xff09;替代border,以达到我们想要的样式。 table thead tr {border: none;outline-color: #fff;ou…

[SWPUCTF 2018]SimplePHP1

打开环境 有查看文件跟上传文件&#xff0c;查看文件里面显示没有文件url貌似可以文件读取 上传文件里面可以上传文件。 先看一下可不可以文件读取 /etc/passwd不能读取&#xff0c;源码提示flag在f1ag.php 看看能不能读取当前的文件&#xff0c; 先把代码摘下来 file.php …

Ubuntu 22.04 apt 安装 ros1 ros Noetic Ninjemys

众所周知 ros2还有很多功能没有移植&#xff0c;而ros1官方不再支持 ubuntu 20.04 之后的版本。另一方面Ubuntu 22.04 更新了很多对新硬件的驱动&#xff0c;有更好的兼容性和体验&#xff0c;这就变的很纠结。 如果想在 22.04 使用最新版本的 ros noetic 只有自己编译一个办法…

盘古信息IMS OS 数垒制造操作系统+ 产品及生态部正式营运

启新址吉祥如意&#xff0c;登高楼再谱新篇。2024年1月22日&#xff0c;广东盘古信息科技股份有限公司新办公楼层正式投入使用并举行了揭牌仪式&#xff0c;以崭新的面貌、奋进的姿态开启全新篇章。 盘古信息总部位于东莞市南信产业园&#xff0c;现根据公司战略发展需求、赋能…

java金额数字转中文

java金额数字转中文 运行结果&#xff1a; 会进行金额的四舍五入。 工具类源代码&#xff1a; /*** 金额数字转为中文*/ public class NumberToCN {/*** 汉语中数字大写*/private static final String[] CN_UPPER_NUMBER {"零", "壹", "贰",…

机器学习第一个项目-----鸢尾花数据集加载及报错解决

项目步骤 如刚开始做&#xff0c;从 “项目开始” 看&#xff1b; 如遇到问题从 “问题” 开始看&#xff1b; 问题 报错如下 ModuleNotFoundError: No module named sklearn解决过程 查看官网&#xff0c;感觉可能是python版本和skilearn版本不匹配&#xff0c;更新一下p…

Django模型(一)

一、介绍 模型,就是python中的类对应数据库中的表 1.1、ORM ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写 ORM 把数据库映射成对象 1.2、示例 1.2.1、模型 from django.db import models…

逻辑推理,形式逻辑:且关系,或关系,前加非后不变,箭头和或的转化

国考省考行测&#xff1a;逻辑推理&#xff0c;形式逻辑&#xff1a;且关系考点 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xf…

旷视low-level系列(一):Bayer Pattern Unification and Bayer Preserving Au

文章目录 1. Motivation2. Contribution3. Methods3.1 BayerUnify3.2 BayerAug 4. CommentsReference 1. Motivation 对于RAW域去噪&#xff0c;通常会将单通道bayer格式的RAW图打包成4通道&#xff0c;然后送入神经网络。不同厂家生产的sensor出的RAW图可能具有不同的bayer模…

互联网加竞赛 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习的人脸专注度…