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

归并排序!

归并排序

https://articles.zsxq.com/id_g23e5o3lg87e.html

目录

  • 归并排序
    • 算法思想
    • 命名由来
    • 算法描述
      • sortList函数
      • mergeSort函数
    • 源代码

算法思想

通过将当前乱序的数组分成两个部分,分别进行「递归调用」,利用两个指针将数据元素以此比较,选择相对较小的元素放进「辅助数组」中,再将辅助数组的数据放回「原数组

命名由来

归并=递归+合并

算法描述

问题描述

leetcode第148题
给你链表的头结点 head,请将其按 升序 排列并返回排序后的链表。

sortList函数

先看sortList,此函数的目的是对链表进行归并排序

ListNode* sortList(ListNode* head) {if (head == nullptr)                   // 1return nullptr;else if (head->next == nullptr)        // 2return head;ListNode *slow = head, *fast = head;   // 3ListNode *pre = nullptr;               while (fast != nullptr){pre = slow;slow = slow->next;fast = fast->next;if (fast)fast = fast->next;}ListNode *tmp = pre->next;pre->next = nullptr;                   //4return mergeSort(head, tmp);           //5}

(1) 当链表没有元素的时候不需要排序,直接返回null;
(2) 当链表只有一个元素的时候也不需要排序,返回本身即可;
(3) 我们用快慢指针来找到链表的中间节点,并将链表分为两部分,分别是左半部分和右半部分;
(4) 此时我们就完成了对一个链表的切割,左边是以head为头结点的链表,右边则是以tmp指针为头结点的链表
(5) 调用 mergeSort 函数进行合并排序。

mergeSort函数

 ListNode* mergeSort(ListNode* a, ListNode* b){a = sortList(a);b = sortList(b);                 // 1ListNode* head = new ListNode(0); ListNode* tmp = head;            // 2head->next = nullptr;while (a || b)                   // 3{if (a == nullptr){tmp->next = b;break;}else if (b == nullptr){tmp->next = a;break;}else if (a->val < b->val){tmp->next = a;a = a->next;}else if (a->val >= b->val){tmp->next = b;b = b->next;}tmp = tmp->next;tmp->next = nullptr;}return head->next;                // 4}

(1) a 和 b 分别表示左边部分和右边部分,将 a 和 b 分别传入 sortList 函数中进行排序(递归调用);
(2) 创建一个新的头节点 head,以及一个临时节点 tmp 用于构建合并后的链表;
(3) 通过比较 a 和 b 的值,逐个选择较小的节点接入到新链表中,直至其中一个链表为空。
(4) 最后,返回合并后链表的头节点(即 head->next),并注意释放之前创建的虚拟头节点。

源代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {ListNode* mergeSort(ListNode* a, ListNode* b){a = sortList(a);b = sortList(b);ListNode* head = new ListNode(0);ListNode* tmp = head;head->next = nullptr;while (a || b){if (a == nullptr){tmp->next = b;break;}else if (b == nullptr){tmp->next = a;break;}else if (a->val < b->val){tmp->next = a;a = a->next;}else if (a->val >= b->val){tmp->next = b;b = b->next;}tmp = tmp->next;tmp->next = nullptr;}return head->next;}
public:ListNode* sortList(ListNode* head) {if (head == nullptr)                   //return nullptr;else if (head->next == nullptr)        // return head;ListNode *slow = head, *fast = head, *pre = nullptr;while (fast != nullptr){pre = slow;slow = slow->next;fast = fast->next;if (fast)fast = fast->next;}ListNode *tmp = pre->next;pre->next = nullptr;return mergeSort(head, tmp);}
};

相关文章:

归并排序!

归并排序 https://articles.zsxq.com/id_g23e5o3lg87e.html 目录 归并排序算法思想命名由来算法描述sortList函数mergeSort函数 源代码 算法思想 通过将当前乱序的数组分成两个部分&#xff0c;分别进行「递归调用」&#xff0c;利用两个指针将数据元素以此比较&#xff0c;选…...

深入探讨:Spring与MyBatis中的连接池与缓存机制

深入探讨&#xff1a;Spring与MyBatis中的连接池与缓存机制 引言 在现代应用程序开发中&#xff0c;性能优化是一个永恒的话题。而在企业级Java应用开发中&#xff0c;Spring和MyBatis是两种非常流行的框架&#xff0c;它们的连接池和缓存机制对应用程序的性能有着至关重要的…...

[C#]使用C#部署yolov10的目标检测tensorrt模型

【测试通过环境】 win10 x64vs2019 cuda11.7cudnn8.8.0 TensorRT-8.6.1.6 opencvsharp4.9.0 .NET Framework4.7.2 NVIDIA GeForce RTX 2070 Super cuda和tensorrt版本和上述环境版本不一样的需要重新编译TensorRtExtern.dll&#xff0c;TensorRtExtern源码地址&#xff1a;T…...

Linux CFS 调度器 (1):概述

文章目录 1. 前言2. CFS 调度器2.1 概述2.2 一些实现细节2.3 运行队列&#xff1a;红黑树2.4 一些特征2.5 调度策略2.6 调度器类别2.7 扩展&#xff1a;组调度 3. 参考资料 1. 前言 限于作者能力水平&#xff0c;本文可能存在谬误&#xff0c;因此而给读者带来的损失&#xff…...

HBase中Master初始化错误~

ERROR&#xff1a;org.apache.hadoop.hbase.PleaseHoldException:Master is initializing 1、停止HBase运行 2、启动zookeeper中的zkCli.sh服务 ./zookeeper/bin/zkCli.sh 3、执行完毕显示以下结果,删除habse文件夹 4、重新启动HBase即可。...

Hive on Spark版本兼容性

Hive on Spark仅在特定版本的Spark上进行测试&#xff0c;因此给定版本的Hive只能保证与特定版本的Spark一起工作。其他版本的Spark可能与给定版本的Hive一起工作&#xff0c;但不能保证。以下是Hive版本及其对应的Spark版本列表&#xff1a; 详情参考官方文档&#xff1a;http…...

grep命令知多少

引言 1. grep命令的重要性 在Linux系统中&#xff0c;grep是一个不可或缺的文本处理工具&#xff0c;它允许用户快速搜索文件中的文本模式。这个命令的名称来源于Global Regular Expression Print&#xff0c;即全局正则表达式打印&#xff0c;它源自UNIX早期的ed文本编辑器。…...

[java]windows和linux下jdk1.8安装包所有版本系列下载地址汇总

【windows jdk1.9系列下载地址】 序号java版本下载地址1java-jdk9-jdk-9.0.1-windows-x64-bin.zip点我下载 【windows jdk1.8系列下载地址】 序号java版本下载地址1java-jdk1.8-jdk-8u202-windows-x64.zip点我下载2java-jdk1.8-jdk-8u201-windows-x64.zip点我下载3java-jdk1…...

Electron+Vue开源软件:洛雪音乐助手V2.8畅享海量免费歌曲

洛雪音乐助手是一款功能全面且完全免费的开源音乐软件&#xff0c;支持在Windows、Android和iOS平台上使用。 平台支持&#xff1a; 桌面版&#xff1a;采用Electron Vue技术栈开发&#xff0c;支持Windows 7及以上版本、Mac OS和Linux&#xff0c;具有广泛的用户群体覆盖。 …...

CAPL通过addTimeToMeasurementStartTime或者getLocalTime获取本地时间

文章目录 getLocalTimeaddTimeToMeasurementStartTimegetLocalTime long tm[9]; getLocalTime(tm); // now tm contains the following entries: // tm[0] = 3; (seconds) // tm[1] = 51; (minutes) // tm[2] = 16; (hours)...

谷歌上架,APP被移除了,没封号,换个包名还能重新提审上架?

对于在Google Play上架应用的开发者来说&#xff0c;尤其是那些矩阵式上架马甲包的开发者&#xff0c;可能已经遭遇过无数次应用被暂停或移除的情况了。通常这种情况下&#xff0c;账号也随之会被封&#xff0c;且大多数开发者认为&#xff0c;没有立马收到封号邮件的话&#x…...

Docker部署MaxKB 知识库(提高问答命中率)

前言 上一篇文章简单的介绍了下MaxKB&#xff0c;这一篇文章就讲如何部署MaxKB。 MaxKB实现逻辑也比较简单&#xff0c;如下图。 安装 修改Docker镜像源 由于不可抗力&#xff0c;部分源已经无法使用&#xff0c;需要修改以下的源地址来拉取镜像。如果是linux&#xff0c;…...

LeetCode739每日温度

题目描述 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 解析 每次往栈中…...

【Qt】Qt中的几种Timer

1. QObject::startTimer int QObject::startTimer(int interval, Qt::TimerType timerType Qt::CoarseTimer) int QObject::startTimer(std::chrono::milliseconds time, Qt::TimerType timerType Qt::CoarseTimer)每次时间到了会调用虚函数timerEvent() 2. QTimer 3. QBa…...

Excel 多列组合内容循环展开

某表格 A 列是编号&#xff0c;其他列是用逗号分隔的意义不同的分类列 ABCDEFG1Assembly#ProductTypeUnit ConfigNominal CapacitySupply VoltageGenerationCase Construction23H1012290001CMD,P24,36FAA,B33H1012290002CMD,P48,60FA,BA,B43H1012290003CMD,P24,36B,C,D,EAA,B …...

Vue2+Element-ui实现el-table表格自适应高度

效果图 新建指令 Vue.directive(height, {inserted(el, _binding, vnode) {const paginationRef vnode.context.$refs.paginationRefconst calculateHeight () > {const windowHeight window.innerHeightconst topOffset el.getBoundingClientRect().topconst otherEle…...

【人工智能】开发AI可能获刑?加州1047草案详解

引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其应用领域不断扩展&#xff0c;但同时也引发了诸多争议和监管问题。近期&#xff0c;加州参议院以32比1的压倒性投票通过了1047号草案&#xff0c;又称《前沿人工智能模型安全可靠创新法案》。这一草案…...

机器学习二分类数据集预处理全流程实战讲解

本文概述 本文对weatherAUS数据集进行缺失值分析并剔除高缺失特征&#xff0c;合理填补剩余缺失值&#xff0c;利用相关性筛选关键特征&#xff0c;采用多种机器学习模型&#xff08;如逻辑回归、随机森林等&#xff09;在80%训练集上训练&#xff0c;并在20%测试集上预测明日降…...

大模型应用:LangChain-Golang核心模块使用

1.简介 LangChain是一个开源的框架&#xff0c;它提供了构建基于大模型的AI应用所需的模块和工具。它可以帮助开发者轻松地与大型语言模型(LLM)集成&#xff0c;实现文本生成、问答、翻译、对话等任务。LangChain的出现大大降低了AI应用开发的门槛&#xff0c;使得任何人都可以…...

【Tkinter界面】Canvas 图形绘制(03/5)

文章目录 一、说明二、画布和画布对象2.1 画布坐标系2.2 鼠标点中画布位置2.3 画布对象显示的顺序2.4 指定画布对象 三、你应该知道的画布对象操作3.1 什么是Tag3.2 操作Tag的函数 https://www.cnblogs.com/rainbow-tan/p/14852553.html 一、说明 Canvas&#xff08;画布&…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...