十大排序算法之->归并排序

news2024/12/28 2:56:58

一、归并排序简介

归并排序是一种基于分治策略的有效且稳定的排序算法。归并排序由约翰·冯·诺伊曼提出,是计算机科学中一个非常基础且历史悠久的算法。

归并排序利用分治法的策略,将一个大的数组拆分成几个小的子数组,这些子数组各自独立地排序,然后逐步合并成一个完全有序的大数组。归并排序的时间复杂度为O(n log n),空间复杂度为O(n),其中n是待排序元素的数量。这种算法特别适合于数据量大且对稳定性有要求的排序场景。稳定性指的是相同值的元素在排序前后保持原有的顺序不变。

归并排序的操作过程:

1、递归地将数组分成两半直到每个子数组只包含一个元素。

2、从最小单个元素数组开始合并,创建一个临时数组来存放合并后的结果,设置两个指针分别指向两个子数组的起始位置。比较这两个指针所指的元素,将较小的元素放入临时数组然后删除源数组元素。重复这个过程,直到其中一个数组为空时,将另一数组剩余元素添加到临时数组末尾。

3、回溯并合并将临时数组的内容复制回原数组,完成这一级的合并工作。

特点:归并排序采用的是分治策略,它可以高效地处理大量数据,尤其适用于对稳定性有要求的情况。

图片

二、Python代码实现 

# -*- coding: utf-8 -*-
"""
小黑测试员
======================================
   File Name  :merge_sort.py
   Author     :lanmingyong
   date       :2024/5/15 14:39
   Description:归并排序是一种基于分治策略的有效且稳定的排序算法。
                归并排序利用分治法的策略,将一个大的数组拆分成几个小的子数组,这些子数组各自独立地排序,然后逐步合并成一个完全有序的大数组。归并排序的时间复杂度为O(n log n),空间复杂度为O(n),其中n是待排序元素的数量。
=======================================
"""


def merge_sort(arr):
    """递归方式将数组进行分割,直到数组只有一个元素"""
    if len(arr) == 1:  # 如果组分割到只剩一个元素时,结束
        return arr
    mid = len(arr) // 2  # 将数组分成1/2
    arr_left = merge_sort(arr[:mid])  # 继续将arr_left数组分成两半
    arr_right = merge_sort(arr[mid:])  # 继续将arr_right数组分成两半
    return merge(arr_left, arr_right)  # 从根根节点开始给两个数组进行排序,并返回排好序的列表


def merge(arr_left, arr_right):
    "从左往右遍历两个数组,比较大小,小的放到新数组的第一位,再取小数那一组数组的第二位与第一次比较大的数对比,小的放到新数组的第二位,依次类推"
    result_arr = []  # 存放排序好的列表
    # 当其中一个数组被取完所有值后,将另一个数量剩余元素放到排序后的数组之后结束循环并返回列表
    while True:
        if len(arr_left) == 0:
            result_arr = result_arr + arr_right
            print("每一小组排序结果"+str(result_arr))  # 调试查看每小组排序结果
            return result_arr
        if len(arr_right) == 0:
            result_arr = result_arr + arr_left
            print("每一小组排序结果"+str(result_arr))  # 调试查看每小组排序结果
            return result_arr
        if arr_left[0] > arr_right[0]:
            result_arr.append(arr_right[0])
            arr_right.pop(0)
        else:
            result_arr.append(arr_left[0])
            arr_left.pop(0)

# 验证
arr = [9, 6, 7, 2, 8, 1, 0, 4, 3,0]
# arr = [89, 65, 21, 8, 76, 79, 0, 86, 51, 33, 34, 8, 76, 53, 93, 88, 65, 0, 92, 56, 76, 9, 0, 54, 9, 37, 94, 72, 92, 72, 88, 44, 34, 48, 14, 22, 76, 34, 45, 50, 66, 4, 77, 41, 64, 24, 65, 99, 16, 64]
print(merge_sort(arr))

# 执行输出
"""
每一小组排序结果[6, 9]
每一小组排序结果[2, 8]
每一小组排序结果[2, 7, 8]
每一小组排序结果[2, 6, 7, 8, 9]
每一小组排序结果[0, 1]
每一小组排序结果[0, 3]
每一小组排序结果[0, 3, 4]
每一小组排序结果[0, 0, 1, 3, 4]
每一小组排序结果[0, 0, 1, 2, 3, 4, 6, 7, 8, 9]
[0, 0, 1, 2, 3, 4, 6, 7, 8, 9]
"""

三、动画演示

欢迎大家关注我的订阅号,会不定期分享一些相关的文章,有问题也欢迎一起讨论交流学习!
在这里插入图片描述 

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

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

相关文章

力扣82题删除排序链表中的重复元素

82题删除排序链表中的重复元素 题目描述 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 题目分析 这个题需要返回已排序链表,我们需要考虑一种情况就是头结点为重复元素&…

43k Star!推荐一款功能强大的开源笔记软件!

程序员的公众号:源1024,获取更多资料,无加密无套路! 最近整理了一份大厂面试资料《史上最全大厂面试题》,Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

dubbo复习:(3) 服务超时时间配置

在dubbo admin中 可以进行类似如下配置 configVersion: v2.7 enabled: true configs:- side: consumeraddresses:- 0.0.0.0parameters:timeout: 55这样配置之后,当服务端响应超过55毫秒时,在服务消费者的控制台就会看到超时信息

##21 深入理解文本处理:使用PyTorch进行NLP基础操作

文章目录 前言简介文本预处理实现分词构建词汇表 文本向量化构建简单的文本分类模型结论 前言 在现代深度学习应用中,文本处理是不可或缺的一部分,尤其在自然语言处理(NLP)领域。借助强大的框架如PyTorch,我们可以更加…

软件测试常见面试题合集(内附详细答案)

01 软件测试理论部分 1.1 测试概念 1. 请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试:完成最小的软件设计单元(模块)的验证工作,目标是确保模块被正确的编码 集成测试:通过测试发现与…

【强化学习】DQN类算法的一些理解

一、DQN算法为什么要使用两个网络? DQN算法通常包含两个网络:一个是评估网络training_network,另一个是目标网络target_network。这两个网络的结构和初始权重是相同的,但它们的权重是不同步更新的。使用两个网络的原因是为了稳定…

【数组中重复的数据】leetcode,python

和上题一样,【找到所有数组中消失的数字】 换个判断条件就行 class Solution:def findDuplicates(self, nums: List[int]) -> List[int]:nlen(nums)for i in nums:x(i-1)%nnums[x]n#只需要替换条件即可return [i1 for i,num in enumerate(nums) if num>(2*n)…

easyx快速入门1

1.基本说明 EasyX 是针对 C 的图形库,可以帮助 C/C 初学者快速上手图形和游戏编程。 比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练…

公共命名空间和RHP

概述 RHP的全称是:the little Robot that Helped me Program,帮我编程序的小机器人。 RHP必然存在,C语言的宏、C的模板,都是RHP;更复杂的例子,是lex和yacc,它们是制作程序的程序,也…

YOLOv9训练自己的数据集:最新最详细教程

一、代码及论文链接: 代码链接:https://github.com/WongKinYiu/yolov9/tree/main 论文链接:https://arxiv.org/abs/2402.13616 二、使用步骤 1.1 虚拟环境配置 创建一个虚拟环境用于单独对yolov9的环境进行配置: conda crea…

Latex问题1

问题 添加bib文件的引用后 \bibliographystyle{IEEEtran} \bibliography{IEEEabrv}之后,出现莫名其妙的错误,如下 IEEEabrv.bib是我的参考文献的bib文件,CCS_1.tex是我的tex文件,bib文件中的内容为 ARTICLE{1,author{Capponi,…

冥想训练具体方法有哪些|流静冥想

冥想是一种身体的放松和敏锐的警觉性相结合的状态。 每日练习的好处远不止你花在集中注意力的那几分钟。桑托雷利是建在乌斯特的马萨诸塞大学医学院的减压诊所的所长,她也是《自愈》的作者,她说:"冥想是一种工具,通过练习&a…

Python使用asyncio包实现异步编程

1. 异步编程 异步编程是一种编程范式,用于处理程序中需要等待异步操作完成后才能继续执行的情况。异步编程允许程序在执行耗时的操作时不被阻塞,而是在等待操作完成时继续执行其他任务。这对于处理诸如文件 I/O、网络请求、定时器等需要等待的操作非常有…

如何隐藏计算机IP地址,保证隐私安全?

隐藏计算机的IP地址在互联网在线活动种可以保护个人隐私,这是在线活动的一种常见做法,包括隐私问题、安全性和访问限制内容等场景。那么如何做到呢?有很5种方法分享。每种方法都有自己的优点和缺点。 1. 虚拟网络 当您连接到虚拟服务器时,您…

干什么副业好呢?

选择适合自己的副业可以根据个人的兴趣、技能和时间来决定。以下是一些常见的副业选择 1. 在线销售 可以在电商平台上开设自己的网店,销售自己感兴趣的产品,如手工艺品、服装、配饰等。 2. 做任务 网上我还在做的致米宝库,一个月有个一千多…

【go项目01_学习记录12】

代码组织 1 代码结构2 重构与测试2.1 安装测试功能2.2 testify 的常用断言函数 3 表组测试 1 代码结构 所有的代码写在一个main.go文件里面,GO编译器也是可以正常执行的。但是当代码量很庞大时,很难进行维护。 Go Web 程序的代码组织 单文件——反模式…

滑动窗口算法及相关习题

滑动窗口 又叫"同向双指针", left和right指针构成一个窗口 一般可以利用单调性时, 用到滑动窗口 使用: 定义left 0,right 0进窗口判断出窗口 还有一步是更新结果, 在哪一步更新是根据题意的 其中234步循环进行 一. 长度最小的子数组 答案 二.无重复字符的最长…

前馈神经网络FNN、多层感知机MLP和反向传播推导

目录 一、前馈神经网络FNN 激活函数的使用 二、多层感知机MLP MLP的典型结构 多层感知机MLP的特点 和前馈神经网络FNN的区别 三、传播推导 1、前向传播(Forward propagation) (1)输入层到隐藏层 (2)隐藏层到输出层 2、…

(C语言)队列实现与用队列实现栈

目录 1.队列 1.1队列的概念及结构 1.2 队列的实际应用联想 1.3队列的实现 2. 队列应用——队列实现栈 主要思路 1.队列 1.1队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进…

报错:(idea端口被占用)Web server failed to start. Port 9090 was already in use.

cmd里面输入: netstat -ano|findstr "9090" 可以看到pid是9644 然后再打开任务管理器