排序算法笔记-归并排序

news/2024/5/21 5:14:29/文章来源:https://blog.csdn.net/weixin_54174102/article/details/131695767

请添加图片描述

归并排序

简介

通过找到中间值,然后递归分别从左区间和右区间找中间值,最终将所给的值划分为单个块,然后进行一步一步回溯,分块由两个单个分区排序后合成一个,以此类推,最后实现有序排序

时间复杂度

最优 nlogn
最差 n
logn

空间复杂度

O(n)

优点

归并排序是一种稳定的排序算法,且适用于各种数据情况。它的主要优点是具有稳定的时间复杂度和良好的性能。尤其是在对链表等非随机访问的数据结构进行排序时,归并排序是一种常用的选择。

解题模版

		public void mergeSort(int[] nums) {if (nums == null || nums.length <= 1) {return;}mergeSort(nums, 0, nums.length - 1);}private void mergeSort(int[] nums, int left, int right) {if (left >= right) {return;}int mid = left + (right - left) / 2;mergeSort(nums, left, mid);mergeSort(nums, mid + 1, right);merge(nums, left, mid, right);}private void merge(int[] nums, int left, int mid, int right) {int[] temp = new int[right - left + 1];int i = left, j = mid + 1, k = 0;while (i <= mid && j <= right) {if (nums[i] <= nums[j]) {temp[k++] = nums[i++];} else {temp[k++] = nums[j++];}}while (i <= mid) {temp[k++] = nums[i++];}while (j <= right) {temp[k++] = nums[j++];}System.arraycopy(temp, 0, nums, left, temp.length);}

练习题

88. 合并两个有序数组

模版的后半部分,使用三个指针分别指向nums1,nums2,nums1的尾部,从而进行比较赋值,换位

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int p1 = m-1;int p2 = n-1;int p = m+n-1;while(p1>=0 && p2 >= 0){if(nums1[p1] >nums2[p2]){nums1[p] = nums1[p1];p1--;}else{nums1[p] = nums2[p2];p2--;}p--;}while(p2>=0){nums1[p] = nums2[p2];p2--;p--;}}
}
  1. 排序链表
    同样的思路放在链表中,通过找到中间值,然后将其中间值下一个指向空值,将链表分成两个,以此类推,分成n份,之后在重新连接,最终形成一个新的排序好的链表

class Solution {public ListNode sortList(ListNode head) {if(head == null || head.next == null){return head;}ListNode mid = findMiddle(head);ListNode midNext = mid.next;mid.next = null;ListNode left = sortList(head);ListNode right = sortList(midNext);return merge(left,right);}private ListNode findMiddle(ListNode head){ListNode slow = head;ListNode fast = head.next;while(fast!= null && fast.next != null){slow = slow.next;fast = fast.next.next;}return slow;}private ListNode merge(ListNode l1,ListNode l2){ListNode dummy = new ListNode(-1);ListNode curr = dummy;while(l1 != null && l2 != null){if(l1.val <l2.val){curr.next = l1;l1 = l1.next;}else{curr.next  = l2;l2 = l2.next;}curr = curr.next;}if(l1 != null){curr.next = l1;}if(l2 != null){curr.next = l2;}return dummy.next;}
}

颜色分类
这个题可以i当做所有排序算法的练习题,使用归并排序,直接套用模版即可

public void sortColors(int []nums){if(nums == null || nums.length <=1){return;}mergeSort(nums,0,nums.length-1);}public void mergeSort(int [] nums,int left,int right){if(left>=right){return;}int mid = left+(right-left)/2;mergeSort(nums,left,mid);mergeSort(nums,mid+1,right);merge(nums,left,mid,right);}private void merge(int []nums,int left,int mid ,int right){int []temp = new int[right-left+1];int i = left,j = mid+1,k=0;while(i<=mid && j<= right){if(nums[i]<=nums[j]){temp[k++] = nums[i++];}else{temp[k++] = nums[j++];}}while(i<=mid){temp[k++] = nums[i++];}while(j<= right){temp[k++] = nums[j++];}System.arraycopy(temp,0,nums,left,temp.length);}
}

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

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

相关文章

计算机网关原理、子网掩码原理(路由器、交换机)(网关:与以太网接口关联的路由)

文章目录 网关网关的历史网关的功能网关的原理相关疑问为什么用子网掩码与IP地址进行与运算来确定一个IP地址所属的子网&#xff1f;网关地址是谁定的&#xff0c;是配置路由的人随意定的吗&#xff1f;&#xff08;配置人员定的&#xff09;如何正确设置网关地址&#xff08;路…

[MySQL]MySQL内置函数

[MySQL]MySQL内置函数 文章目录 [MySQL]MySQL内置函数1. 日期函数2. 字符串函数3. 数学函数4. 其他函数 1. 日期函数 常用日期函数如下&#xff1a; 函数名称描述current_date()获取当前日期current_time()获取当前时间current_timestamp()获取当前时间戳now()获取当前日期时…

无法将“pip“识别为cmdlet、函数、脚本文件或可运行程序的名称。

出现问题如下&#xff1a; 出现问题原因&#xff1a; 没有添加pip对应的安装目录进入环境变量里面的系统变量。 解决方案&#xff1a; 1.确定python的安装路径 将python的路径添加到系统变量中 2.输入pip所在的安装路径&#xff1a; python路径\Lib\site-packages 3.添加…

如何执行Photoshop脚本

环境 Photoshop: CC2017 OS: Windows 10 脚本放置位置 C:\Program Files\Adobe\Adobe Photoshop CC 2015\Presets\Scripts #也就是 PS的安装目录\Presets\Scripts

程序员,到美国!赚美元!!!

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

Python 和 RabbitMQ 进行消息传递和处理

一、RabbitMQ 简介 RabbitMQ 是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;标准。它的官方客户端提供了多种编程语言的接口&#xff0c;包括 Python、Java 和 Ruby 等。它支持消息的持久化、多种交换机类型、消息通知机制、灵活…

Orange pi3初调试

因为树莓派沦为理财产品1年前出手殆尽后&#xff0c;现在唯一一个B性能不足一直没动力调试&#xff0c;沦为吃灰工具。 偶然之间多多给推了个orange产品预售&#xff0c;看了下pi3的参数&#xff0c;这不和赚了差价的3B一个性能吗&#xff1f;果断定了个预售款&#xff0c;在差…

2023年Unity面试题大全,共十万字面试题总结【收藏一篇足够面试,持续更新】

&#x1f388;前言 为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整理了新的内容&#xff0c;并对之前的版本中有些模糊的地方进行了纠正。此篇文章为Unity所有面试题模块的目录导航文章&#xff0c;全网最全的 Unity 面试题 都在这里了…

反转链表 (反转整个链表+反转部分链表)

简单问题&#xff1a;反转整个链表 定义一个函数&#xff0c;输入一个链表的头节点&#xff0c;反转该链表并输出反转后链表的头节点。 解题思路&#xff1a; 1.因为反转后链表的末尾节点是原链表的头节点&#xff0c;所以一开始将头节点的后驱保存起来&#xff1b; 2.将头节…

漏洞攻击 --- TCP -- 半开攻击、RST攻击

TCP半开攻击&#xff08;半连接攻击&#xff09; --- syn攻击 &#xff08;1&#xff09;定义&#xff1a; sys 攻击数据是DOS攻击的一种&#xff0c;利用TCP协议缺陷&#xff0c;发送大量的半连接请求&#xff0c;耗费CPU和内存资源&#xff0c;发生在TCP三次握手中。 A向B…

计算机视觉的图像标注与视觉任务

1 ​计算机视觉应用 计算机视觉是一种利用计算机和数学算法来模拟人类视觉的技术&#xff0c;可以应用于许多领域。以下是计算机视觉的八大应用&#xff1a; 图像识别&#xff1a;利用计算机视觉技术&#xff0c;可以对图像进行分类、识别和分割&#xff0c;从而实现自动化的…

AI + 电力、大模型主题师资培训落地,飞桨持续赋能AI人才培养

随着数字浪潮袭来&#xff0c;人工智能的发展声势浩大&#xff0c;高校人工智能专业建设以及AI的人才培养已经提上日程。如何夯实产教融合&#xff0c;加快人工智能研究创新&#xff0c;培养具备AI系统能力和电力行业知识的拔尖人才&#xff0c;是推进电力产业智能化升级的迫切…

uniapp 封装公共方法(无需每个页面引用,直接调用)

封装方法: 1. 在根目录下建立common文件夹 创建com.js 2.在main.js中挂载(写在定义vue之后) import $com from /common/com.js Vue.prototype.$com $com 3.在com.js中按照以下格式定义方法 export default {//定义需要的方法 } 4.使用 click"$com.已经定义的方法名&q…

分布式ELK 企业级日志分析系统

一、ELK的相关知识 1.ELK简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ElasticSearch&#xff1a;是基于Lucene&#xff08;一个全文检…

Flutter入门教程(一),2023最新版包含安装,初始化!简单易懂!

Flutter入门教程&#xff08;一&#xff09;&#xff0c;2023最新版包含安装&#xff0c;初始化&#xff01;简单易懂&#xff01; Flutter介绍 首先&#xff0c;在一切的开始之前我们来介绍一下什么是Flutter&#xff0c;Flutter 是一个由 Google 开发的开源移动应用程序开发…

永久区和元空间的区别

一文搞懂JVM之 方法区、永久代、元空间三者的区别 - 知乎 元空间和永久代的区别-腾讯云开发者社区-腾讯云 方法区和永久区/元空间之间的关系 - 简书 方法区(Method Area),是JVM规范中提出的一个(概念)&#xff0c;用于存储类信息、常量池、静态变量、JIT编译后的代码等。 Th…

大模型基础知识 - 语言模型及其演进 公开版

本文为作者内部分享文档&#xff0c;由于不涉敏可以公开&#xff0c;分享本身是课程形式&#xff0c;有什么疑问欢迎在评论区留言。 开场白 人工智能发展到现在&#xff0c;在2个重要领域取得了重大突破&#xff0c;有望达到人类水平&#xff1a; 计算机视觉 &#xff08;Com…

cuda中radix_sort

背景 radix_sort排序是一种经典排序&#xff0c;在gpu上都有对其进行支持&#xff0c;这里主要参考cub中的实现&#xff0c;简单介绍一种单block的情形, 本文只适合看过源码但是没有看懂的同学。 流程 在second step中完全实在ScanCounters()函数中&#xff0c;具体分为upswe…

【Android】从零搭建组件化项目

组件化系列文章介绍的内容稍微多了点&#xff0c;本着研究透这玩意的精神&#xff0c;从组件化的简介开始说起。 目录 简介组件化、模块化与插件化开始创建配置共享文件打包模式配置APT与JavaPoet 简介 什么是组件化&#xff1f; 将多个功能模板拆分、重组的过程。 为什么要使…

使用mongodump和mongorestore备份与恢复Mongodb数据

一、备份与恢复方案 mongodump是MongoDB官方提供的备份工具,它可以从MongoDB数据库读取数据,并生成BSON文件,mongodump适合用于备份和恢复数据量较小的MongoDB数据库, 不适用于大数据量备份。 默认情况下mongodump不获取local数据库里面的内容。mongodump仅备份数据库中的文档…