【算法】Merge Sort 合并排序

news2024/11/25 13:37:47

Merge Sort概述

分而治之算法

递归地将问题分解为多个子问题,直到它们变得简单易解
将解决方案组合起来,解决原有问题

O(n*log(n))运行时间

基于比较的算法的最佳运行时间

一般原则
·合并排序:
1. 将数组分成两半
2.在每一半上调用合并排序以递归排序
3.将两个已排序的两半合并为一个已排序数组

看一个例子:

2,6,5,1,7,4,3

首先第一步,是将数组分成两半,分到直到分不了了。

然后现在,对每组数据进行排序。

2,6

1,5

4,7

然后,再一组一组排序:
1,2,5,6

3,4,7

然后最后两组排序

1,2,3,4,5,6,7

注意这里是,1和3比,选1,2和3比,选2,5和3比,选3,4和5比,选4。。。

Python实现MergeSort合并排序

def merge_sort(arr):
    if len(arr) > 1: #要保证大于1才能排序
        left_arr = arr[:len(arr)//2] #定义2个子数组,这个是从索引0到中心点,:左留下空白就是取左边所有
        right_arr = arr[len(arr)//2:] #这个是从中心点到右边

        # 递归
        merge_sort(left_arr)
        merge_sort(right_arr) #分别再左右两个数组进行递归
        # 执行以上两行以后,左右两个数组都按照顺序排列了

        # 合并
        # 现在两个数组已经拍好顺序,我们想让两个数组,第一个数组的最左边和第二个数组最左边进行比较
        # 所以,创建索引进行追踪
        i = 0 #追踪第一个左边数组
        j = 0 #追踪右边
        k = 0 #追踪合并数组中的索引
        while i < len(left_arr) and j < len(right_arr):
            if left_arr[i] < right_arr[j]:#如果左边的数组值小
                arr[k] = left_arr[i] # 保存索引对应的值
                i += 1
                #k += 1
                #因为我们取得是i的值,所以,必须i+1进入下一个索引,而且,k是合并后的数组,也要进入下一个
            else:
                arr[k] = right_arr[j]
                j += 1
                #k += 1
            k += 1  #简略后,放这里

        # 现在只考虑转移左边的数组,不考虑右边的数组;
        # 这是假设,右边都排好了,但是左边没排完
        while i < len(left_arr):
            arr[k] = left_arr[i]
            i += 1
            k += 1

        # 假设左边都排好了,但是右边还要排
        while j < len(right_arr):
            arr[k] = right_arr[j]
            j += 1
            k += 1



arr_test = [2,3,5,1,7,4,4,4,2,6,0]
merge_sort(arr_test)
print(arr_test)

问题:
 

 merge_sort(left_arr)
2    merge_sort(right_arr) #分别再左右两个数组进行递归
3    # 执行以上两行以后,左右两个数组都按照顺序排列了    这里是什么意思?是直接调用我定义的函数吗?函数不是没写完吗?

这里正是体现了递归函数的工作原理。当你在代码中调用 merge_sort(left_arr)merge_sort(right_arr) 时,你实际上是在调用当前函数自身,但是传入了不同的参数——即左侧子数组和右侧子数组。

虽然从直观上看,函数“还没有写完”,但实际上,每次调用 merge_sort 函数时,它都在执行完整的逻辑流程:

  1. 检查当前数组的长度是否大于1,如果是,则继续执行。
  2. 将当前数组分割成两个子数组(左侧和右侧)。
  3. 对这两个子数组分别递归调用 merge_sort 函数。这里就是递归发生的地方,每一次这样的调用都会重复整个过程,直到数组被拆分到不能再拆分(即长度为1或0,视为已排序)。
  4. 最后,通过合并这些小数组来完成排序。

因此,即便在某次调用中函数尚未执行到合并步骤,之前的调用(处理更小规模数组的那些调用)已经在逐步完成它们的任务。当这些更深层次的递归调用返回时,它们会逐级返回到上一层,最终回到最初的函数调用,这时所有子数组都已经排序完毕,可以进行最终的合并,完成整个数组的排序。

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

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

相关文章

进程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

进程 进程的概念 何为进程&#xff1f; 进程是一个应用程序的执行实例&#xff0c;也就是系统中正在运行的应用程序&#xff0c;程序一旦运行就是进程 进程是一个动态过程&#xff0c;它是程序的一次运行过程&#xff0c;而非静态文件 同一个程序可以被运行多次&#xff0c;…

扎克伯格抨击闭源人工智能竞争对手试图“创造上帝”

Meta 首席执行官马克-扎克伯格&#xff08;Mark Zuckerberg&#xff09;在周四发表的一篇访谈中谈到了他对人工智能未来的看法&#xff0c;他深信"不会只有一种人工智能"。扎克伯格强调了开源的价值&#xff0c;即把人工智能工具交到许多人手中&#xff0c;他还不忘贬…

博创智能IPO终止:曾因对赌失败而赔偿,左手分红、右手募资补流

近日&#xff0c;上海证券交易所披露的信息显示&#xff0c;博创智能装备股份有限公司&#xff08;下称“博创智能”&#xff09;及其保荐人国金证券撤回上市申请文件。因此&#xff0c;上海证券交易所决定终止对其首次公开发行股票并在科创板上市的审核。 据贝多财经了解&…

从AICore到TensorCore:华为910B与NVIDIA A100全面分析

华为NPU 910B与NVIDIA GPU A100性能对比&#xff0c;从AICore到TensorCore&#xff0c;展现各自计算核心优势。 AI 2.0浪潮汹涌而来&#xff0c;若仍将其与区块链等量齐观&#xff0c;视作炒作泡沫&#xff0c;则将错失新时代的巨大机遇。现在&#xff0c;就是把握AI时代的关键…

OpenGL3.3_C++_Windows(22)

材质&#xff1a; 决定物体在渲染过程中最终视觉呈现的关键因素之一&#xff0c;它通过一系列光学&#xff08;投光物&#xff09;和物理参数&#xff08;反光度&#xff0c;反照率、金属度&#xff0c;折射率……&#xff09;准确模拟现实世界中的材料特性&#xff0c;从而增…

我重生了,学会了珂朵莉树

还玩线段树吗&#xff1f; 前言&注明 我好像一万年没更新了&#xff1f; 化学&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

NSSCTF-Web题目18(反序列化)

目录 [NISACTF 2022]babyserialize 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]ez_ez_unserialize 4、题目 5、知识点 6、思路 [NISACTF 2022]babyserialize 1、题目 2、知识点 反序列化、绕过过滤、命令执行 3、思路 <?php include "waf.php";…

【RAG】FoRAG:面向网络增强型长形式问答的事实性优化RAG

一、解决问题 在基于网络的长形式问答&#xff08;Web-enhanced Long-form Question Answering, LFQA&#xff09;任务中&#xff0c;现有RAG在生成答案时存在的问题&#xff1a; 事实性不足&#xff1a;研究表明&#xff0c;现有系统生成的答案中只有大约一半的陈述能够完全得…

填报高考志愿时,学校、专业和城市怎么选择呢?

我的观点是&#xff1a; 专业>城市>学校 专业是兴趣导向&#xff0c;符合自己的价值观&#xff0c;失去了这种驱动力的专业学习&#xff0c;会变得非常艰难的&#xff0c;而且没有竞争力&#xff0c;所以我的排序第一位是专业。 其次是城市&#xff0c;最好是一线城市&…

vue3.0(十五)内置组件Teleport和Suspense

文章目录 一、Teleport1.基本用法2.禁用Teleport3.多个 Teleport 共享目标4.搭配组件 二、 Suspense1.什么是Suspense2.异步依赖3.加载中状态4.事件5.错误处理6.和其他组件结合注意 一、Teleport <Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板…

java+mysql通讯录管理

完整代码地址如果控制台打印出现乱码&#xff0c;进行如下设置

stm32-hal库(5)--usart串口通信三种模式(主从通信)(关于通信失败和串口不断发送数据问题的解决)

问题&#xff1a; 最近发现&#xff0c;stm32cubemx最新版本f1系列的hal库&#xff08;1.85版本&#xff09;生成的hal库&#xff0c;其中stm32f1xx_hal_uart.c的库文件中&#xff0c;其串口发送接收存在一些问题&#xff1a; 1.没有使用 __HAL_LOCK 和 __HAL_UNLOCK 宏&…

LinkedIn被封原因和解封方法

对于初识领英和对领英生态规则不熟悉的人来说&#xff0c;很容易造成领英账号被封号(被限制登录)的情况&#xff0c;那么如何才能避免和解决领英帐号被封号(被限制登录)的难题呢&#xff1f; 领英帐号被封号或被限制登录主要会有两类情况。 首先要搞清楚&#xff0c; Linkedi…

谷歌邮箱被停用,开发者账号也要废了?还能申诉回来吗?怎么申诉?

相信不少开发者都遭遇过开发者账号的邮箱被暂停的情况&#xff0c;有时候明明什么也没做&#xff0c;就被突然被停用了&#xff1f; 面对这种情况&#xff0c;开发者们最担心的莫过于这是否会波及到他们使用该邮箱注册的开发者账号&#xff1f;APP还会正常审核吗&#xff1f;毕…

接口自动化测试关联token的方法?

引言&#xff1a; 在接口自动化测试中&#xff0c;有时候我们需要关联token来进行身份验证或权限管理。本文将从零开始&#xff0c;介绍如何详细且规范地实现接口自动化测试中token的关联。 步骤一&#xff1a;准备工作 在开始之前&#xff0c;我们需要确保以下准备工作已完成…

一文说明白,香港优才计划到底适合哪些人申请?

香港优才计划的热度仍然在持续&#xff0c;自取消配额限制以来&#xff0c;仅2023年一年时间&#xff0c;优才计划申请人数就超过8万&#xff0c;比历年累积的申请人数还要多。 之所以有如此高的热度&#xff0c;完全是因为优才的灵活性&#xff0c;为许多中产精英拿香港身份甚…

Ruoyi-前后端分离部署

目录 一. 环境准备 二. 安装Nginx 三. 安装Java 四. 安装MySQL、Redis 五. 配置打包环境 1. 配置前端打包环境 2. 配置后端打包环境 3. 获取代码 4. 前端代码打包 5. 后端项目打包 六. 项目上线 1.前端项目上线 2. 后端项目上线 一. 环境准备 项目官网&#xff1a…

LED封装技术中SMD、COB和GOB的优缺点

在小间距LED显示屏的封装技术中&#xff0c;SMD、COB和GOB各有其优缺点&#xff0c;以下是对这些技术的详细分析&#xff1a; SMD&#xff08;Surface Mounted Devices&#xff09;表贴工艺技术 SMD技术是将LED灯珠焊接在电路板上的一种成熟技术&#xff0c;广泛应用于LED显示屏…

如何高效安全的开展HPC数据传输,保护数据安全?

高性能计算&#xff08;HPC&#xff09;在多个行业和领域中都有广泛的应用&#xff0c;像科学研究机构、芯片IC设计企业、金融、生物制药、能源、航天航空等。HPC&#xff08;高性能计算&#xff09;环境中的数据传输是一个关键环节&#xff0c;它涉及到将数据快速、安全地在不…

Studying-代码随想录训练营day23| 39.组合总和、40.组合总和II、131.分割回文串

第23天&#xff0c;回溯part02&#xff0c;回溯两个题型组合&#xff0c;切割(ง •_•)ง&#x1f4aa; 目录 39.组合总和 40.组合总和II 131.分割回文串 总结 39.组合总和 文档讲解&#xff1a;代码随想录组合总和 视频讲解&#xff1a;手撕组合总和 题目&#xff1a;…