归并排序算法Python实现

news2024/7/30 11:27:49

归并排序原理和步骤

1. 将数组分成两半,直到每个子数组的长度为1

首先,将数组分成两半。如果数组的长度大于1,将其从中间分割为两个子数组。对每个子数组继续进行这个过程,直到每个子数组的长度为1。此时,所有子数组都是有序的,因为单个元素的数组天然是有序的。

2. 递归地对每个子数组进行排序

在将数组分割为单个元素之后,通过递归方法对每个子数组进行排序。归并排序的递归性质允许我们在底层子数组有序后逐层向上合并已排序的子数组。

3. 合并两个已排序的子数组,得到一个已排序的数组

合并步骤是归并排序的核心。对于两个已经排序的子数组,通过比较它们的元素,将较小的元素依次放入新的数组中,直到所有元素都被处理完。这个过程会生成一个新的已排序数组。

4. 重复以上步骤,直到所有子数组合并成一个最终的排序数组

重复进行分割和合并的步骤,最终将所有子数组合并成一个整体,并且这个整体是有序的。通过这种递归分割和合并的方式,归并排序能够在 O(n log n) 的时间复杂度内完成对数组的排序。

归并排序的完整步骤

  1. 分割: 将数组分成两个子数组。
  2. 递归排序: 递归地对每个子数组进行归并排序。
  3. 合并: 合并两个已排序的子数组,生成一个新的已排序数组。
  4. 重复: 继续对每个子数组进行分割、排序和合并,直到所有子数组合并成一个整体。

归并排序的伪代码如下:

void mergeSort(vector<int>& arr, int left, int right) {
    if (left < right) {
        int mid = left + (right - left) / 2;

        // 递归排序左半部分
        mergeSort(arr, left, mid);

        // 递归排序右半部分
        mergeSort(arr, mid + 1, right);

        // 合并已排序的子数组
        merge(arr, left, mid, right);
    }
}

void merge(vector<int>& arr, int left, int mid, int right) {
    int n1 = mid - left + 1;
    int n2 = right - mid;

    vector<int> leftArr(n1), rightArr(n2);

    for (int i = 0; i < n1; ++i)
        leftArr[i] = arr[left + i];
    for (int j = 0; j < n2; ++j)
        rightArr[j] = arr[mid + 1 + j];

    int i = 0, j = 0, k = left;
    while (i < n1 && j < n2) {
        if (leftArr[i] <= rightArr[j]) {
            arr[k] = leftArr[i];
            ++i;
        } else {
            arr[k] = rightArr[j];
            ++j;
        }
        ++k;
    }

    while (i < n1) {
        arr[k] = leftArr[i];
        ++i;
        ++k;
    }

    while (j < n2) {
        arr[k] = rightArr[j];
        ++j;
        ++k;
    }
}

Python实现如下:

def merge_sort(arr):
    """
    对数组进行归并排序
    :param arr: 待排序的数组
    :return: 已排序的数组
    """
    # 如果数组的长度为0或1,直接返回数组
    if len(arr) <= 1:
        return arr

    # 找到数组的中间点
    mid = len(arr) // 2

    # 递归地对左右两个子数组进行排序
    left = merge_sort(arr[:mid])
    right = merge_sort(arr[mid:])

    # 合并两个已排序的子数组
    return merge(left, right)

def merge(left, right):
    """
    合并两个已排序的子数组
    :param left: 左子数组
    :param right: 右子数组
    :return: 合并后的已排序数组
    """
    result = []
    i = j = 0

    # 合并两个子数组
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    # 追加剩余的元素
    result.extend(left[i:])
    result.extend(right[j:])

    return result



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

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

相关文章

【操作系统】手把手带你搭建DNS服务器!

DNS服务器 DNS服务器指域名系统或者域名服务。域名系统为Internet上的主机分配域名地址和IP地址&#xff0c;用户使用域名地址&#xff0c;该系统就会自动把域名地址转为IP地址。域名服务是运行域名系统的Internet工具。执行域名服务的服务器称之为DNS服务器&#xff0c;通过DN…

在创建jsp项目中解决无法连接数据库以及junit问题

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

入驻长沙!全球数据资产理事会长江中游中心挂牌成立

在全球数据资产化浪潮的推动下&#xff0c;长江中游地区迎来了其在数字经济领域的重要里程碑。 近日&#xff0c;《数据资产长江中游生态论坛暨数据资产入表和价值转化研讨会》于长沙圆满落幕&#xff0c;会上各产业专家、企业高管&#xff0c;围绕数据产品开发、数据资产融资…

小程序复制功能不可用 setClipboardData:fail no permission

先上图 用户协议剪切板也更新但是依旧报错了 最后在公众平台通知里发现是用户之前小程序有规格被封禁了该功能

IP地址SSL证书的申请流程-五大步骤教你如何申请

网站需要申请SSL证书&#xff0c;没有域名或者不方便提供域名&#xff0c;只有IP地址也可以申请SSL证书。特别需要注意的是&#xff0c;为IP地址申请ssl证书是需要开放443或者80端口&#xff0c;一般开放几分钟用来验证IP管理权即可&#xff01; 申请IP地址的SSL证书&#xff…

13--memcache与redis

前言&#xff1a;数据库读取速度较慢一直是无法解决的问题&#xff0c;大型网站应对的方式主要是使用缓存服务器来缓解这种情况&#xff0c;减少数据库访问次数&#xff0c;以提高动态Web等应用的速度、提高可扩展性。 1、简介 Memcached/redis是高性能的分布式内存缓存服务器…

阿里面试:canal+MQ,会有乱序的问题吗?

阿里面试&#xff1a;canalMQ&#xff0c;会有乱序的问题吗&#xff1f; 尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题…

一个 Docker 搭建的自动化电视剧下载和管理工具

大家好,我是CodeQi! 一个标准的“追剧狂人”。每周都有新剧上线,每天都要时刻关注各大影视平台的更新,这无疑是一项体力与脑力并存的艰巨任务。 于是,我决定为自己打造一个自动化的电视剧下载和管理工具。作为一个程序员,用 Docker 搭建这种自动化工具简直是小菜一碟。…

Vue组件通信props和$emit用法

父传子&#xff0c;通过props 子传父&#xff0c;通过$emit App.vue <template><div class"app" style"border: 3px solid #000; margin: 10px">我是APP组件<!-- 1.给组件标签&#xff0c;添加属性方式 赋值 --><!-- 添加属性传值 …

PointCloudLib GridMinimum获取栅格最低点 C++版本

测试效果 简介 在点云库(Point Cloud Library, PCL)中,如果你想要获取一个栅格(Grid)内的最低点,这通常意味着你需要先对点云数据进行某种形式的栅格化处理,然后在每个栅格内寻找最低的点。 测试代码 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointC…

2024透明加密软件最新推荐丨11款好用的透明加密软件

在数字化时代&#xff0c;文件与数据安全愈发重要&#xff0c;保护信息安全刻不容缓。文件加密软件应运而生&#xff0c;成为了信息安全的重要帮手。透明加密技术凭借众多的优点备受青睐。那么&#xff0c;什么是透明加密技术呢&#xff1f; 透明加密技术是一种在不影响用户正…

旷野之间11 - 开源 SORA 已问世!训练您自己的 SORA 模型!

​​​​​ 目前最接近 SORA 的开源模型是 Latte,它采用了与 SORA 相同的 Vision Transformer 架构。Vision Transformer 究竟有何独特之处?它与之前的方法有何不同? Latte 尚未开源其文本转视频训练代码。我们复制了论文中的文本转视频训练代码,并将其提供给任何人使用,…

帕金森小伙伴必看!这些维生素让你的生活更“稳“定!

&#x1f308; 嗨&#xff0c;亲爱的小伙伴们&#xff01;今天来跟大家聊聊帕金森病患者应该补充哪些维生素的小知识&#xff0c;让我们的身体更健康&#xff0c;生活更美好哦&#xff01;&#x1f609; &#x1f34e; 维生素C 你知道吗&#xff1f;维生素C不仅能让我们的皮肤…

【Linux】内核文件系统系统调用流程摸索

内核层可以看到当前调用文件处理的进程ID 这个数据结构是非常大的&#xff1a; 我们打印的pid,tgid就是从这里来的&#xff0c;然后只需要找到pid_t的数据类型就好了。 下图这是运行的日志信息&#xff1a; 从上述日志&#xff0c;其实我也把write的系统调用加了入口的打印信…

ADS基础教程24 - Gerber文件的导入

EM介绍 一、引言二、基本概念1.仿真文件下载2.仿真文件介绍 二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题 四、总结 一、引言 本章节开始介绍在ADS中进行PCB仿真&#xff0c;首先讲解如何将Gerber文件导入到A…

Spark RDD优化

Spark RDD优化 一、分区优化二、持久化优化三、依赖优化四、共享变量优化五、提交模式与运行模式优化六、其他优化 一、分区优化 分区数调整&#xff1a;RDD的分区数可以通过repartition和coalesce方法进行调整。合理的分区数可以提高并行度&#xff0c;但过多的分区会增加管…

2024年Wolf沃尔夫奖数学奖得主出炉:诺加·阿隆(Noga Alon)、阿迪·萨莫尔(Adi Shamir)

沃尔夫基金会官网&#xff1a;2024年沃尔夫数学奖联合颁发给了以色列魏茨曼科学研究所的阿迪萨莫尔 &#xff08;Adi Shamir&#xff0c;1952 -&#xff09; 教授和美国普林斯顿大学的诺加阿隆&#xff08;Noga Alon&#xff0c;1963 -&#xff09; 教授&#xff0c;表彰他们对…

ADI新型充电器解决方案可实现电池堆电压和充电效率

就目前而言&#xff0c;这可能是生活中zui常见的问题了。世纪之交&#xff0c;电池&#xff08;尤其是基于锂离子的电池&#xff09;成本的降低和性能的提高&#xff0c;推动了电池供电的储能和便携式设备的稳步增长。此外&#xff0c;超级电容器由于具有独特的性质&#xff0c…

引用类飘红,但是导入失败

背景&#xff1a; 引用类飘红&#xff0c;且显示可导入&#xff0c;但是导入一直失败。 列如下图&#xff0c;引导你可以导入依赖包&#xff0c;但是你发现按了导入他是导入不了的&#xff0c;就一直失败&#xff0c;就一直飘红 解决方案&#xff1a; 我们用一下idea的清理不…

IDEA中Debug的使用

自定义功能图表 功能说明 光标回到Debug行 执行到光标所在行 Force Step into Step into 进入JDK的配置 step into做了下述配置后&#xff0c;也可以和force step into一样进入到JDK中。 Trace Current Stream Chain Reset Frame 重置方法入栈 Force Return Break Point四…