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

一、归并排序简介

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

归并排序利用分治法的策略,将一个大的数组拆分成几个小的子数组,这些子数组各自独立地排序,然后逐步合并成一个完全有序的大数组。归并排序的时间复杂度为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]
"""

三、动画演示

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

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

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

相关文章

2024中国应急(消防)品牌巡展西安站成功召开!惊喜不断

消防品牌巡展西安站 5月10日,由中国安全产业协会指导,中国安全产业协会应急创新分会、应急救援产业网联合主办,陕西消防协会协办的“一切为了安全”2024年中国应急(消防)品牌巡展-西安站成功举办。该巡展旨在展示中国应急(消防&am…

免费体验GPT-4o这5大功能,非常好用!

这几天,OpenAI发布了新的GPT版本,GPT-4o,比GPT4更加智能也更快。 据说,GPT-4o在文本、推理和编码智能方面实现了GPT-4 Turbo级别的性能,在多语言、文本、音频和视觉功能方面甚至超过了市面上所有同类产品。 有几个亮点…

树链剖分详解,看这一篇就够了

前置知识: 树形结构链式前向星(熟练)线段树(熟练)DFS序(熟练)LCA(了解定义) 什么是树链剖分 树链剖分其实有两种:重链剖分和长链剖分。重链剖分就是把儿子节点最重的儿子称为重儿子,把树分成若干条重链(如图一)&#…

雍禾植发张东宏:以诚相待毛发患者

医学道路上的奋斗往往需要坚定的信念和不懈的努力。对于张东宏医生来说,医学并非止步于书本知识,而是一次次与患者对话、一次次实操中的历练和积累。在他的成长历程中,医学之路如同一棵参天大树,每一步都是扎实的打磨,…

2024年CSPM考试时间线梳理!

最近后台有朋友在问今年CSPM的考试安排,给大家整理一下,需要的朋友认真查看,不要错过考试。2024年5月12日举行了本年度第二次CSPM3级考试~接下来的考试安排如下: 1)2024年CSPM考试安排 本次考试出成绩时间——2024年6…

【RSGIS数据资源】2001-2021 年亚洲季风区主要国家作物种植制度数据集

文章目录 1. 数据集概况2. 数据格式3. 文件名命名规则4. 数据生产服务单位5. 元数据6. 数据引用与参考文献引用 1. 数据集概况 2001-2021 年亚洲季风区主要国家作物种植制度数据集(ACIA500)是结合MODIS 影像和现有的土地利用等多源数据,基于…

QT状态机1-三态循环状态机

#include "MainWindow.h" #include "ui_MainWindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)

【半夜学习MySQL】复合查询(含多表查询、自连接、单行/多行子查询、多列子查询、合并查询等详解)

🏠关于专栏:半夜学习MySQL专栏用于记录MySQL数据相关内容。 🎯每天努力一点点,技术变化看得见 文章目录 回顾基本查询多表查询自连接子查询单行子查询多行子查询多列子查询在from子句中使用子查询合并查询 回顾基本查询 下面使用…

使用python给图片加上文字水印

使用python给图片加上文字水印 作用效果代码 作用 给图片加上文字水印文字水印的字体,颜色,位置可自定义 效果 原图: 加水印后的图: 代码 from PIL import Image, ImageDraw, ImageFontdef add_text_watermark(input_image…

Linux 无名信号量(Semaphore)的使用

目录 一、无名信号量的概念二、无名信号量相关函数三、信号量的使用步骤四、应用场景五、测试代码 一、无名信号量的概念 Linux无名信号量(Semaphore)   在Linux操作系统中,信号量(Semaphore)是一种用于进程间或线程…

OSG编程指南<二十三>:基于OSG+ImGui制作模型编辑器,实现三轴方向的实时平移、旋转和缩放变化

1、概述 在OSG的开发应用过程中,我们有时候总会纠结于使用MFC还是Qt来嵌入OSG窗口以便于后续的功能开发,毕竟选择一个合适的UI框架,对于后续的开发还是省去很多麻烦的。但对于初学者来说,可能对框架消息机制的不熟悉,尤…

景源畅信电商:做抖音有哪些未开发的蓝海领域?

在互联网信息爆炸的今天,抖音已经成为人们获取信息和娱乐的重要渠道。然而,随着用户数量的增加和内容的丰富,抖音的红海竞争也日益激烈。在这样的背景下,寻找还未被充分开发的蓝海领域,对于内容创作者来说,…

基于微信小程序+JAVA Springboot 实现的【智慧乡村旅游服务平台】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称: 基于微信小程序的智慧乡村旅游服务平台的设计与实现 项目技术栈 该项目采用了以下核心技术栈: 后端框架/库: Java SSM框架数据库: MySQL前端技术: 微信开发者工具、uni-app其他技术&#xff1a…

Darknet+ros+realsenseD435i+yolo(ubuntu20.04)

一、下载Darknet_ros mkidr -p yolo_ws/src cd yolo_ws/src git clone --recursive https://github.com/leggedrobotics/darknet_ros.git #因为这样克隆的darknet文件夹是空的,将darknet_ros中的darknet的文件替换成如下 cd darknet_ros git clone https://github.…

自定义注解

例如写一个注解PrintTime 如下: import java.lang.annotation.*;//下面的注解属于元注解 Target({ElementType.PARAMETER,ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface PrintTime {/*** 注解的属性*/public S…

JavaScript 进阶(二)

一、深入对象 1. 创建对象的三种方式 利用 new Object 创建对象 2. 构造函数 【注意事项】 【例】 这样子写好之后,想要添加一个新的结构类似的对象,直接照着红圈中写,最后改相应的数据就好了 注意:红色是第一步,黄…

springboot004网页时装购物系统

springboot004网页时装购物系统 亲测完美运行带论文:获取源码,私信评论或者v:niliuapp 运行视频 包含的文件列表(含论文) 数据库脚本:db.sql其他文件:ppt.pptx论文/文档:开题报告.docx论文&…

如何利用命令提示符列出文件?这里提供了几个实例供你参考

序言 什么命令可以用来列出目录中的文件?如何在命令提示符Windows 10/11中列出文件?很多人对这些问题感到困惑。在这篇文章中,我们详细解释了命令提示符列出文件的主题。 CMD(命令提示符)是一个功能强大的Windows内置…

河南广电与LiblibAI签署战略合作协议

5月15日,河南广电科技与LiblibAI战略签约仪式在郑州中原福塔新闻发布厅隆重举行。双方将本着“共商、共享、共建、共赢”原则,基于全面、可持续的战略合作伙伴关系,发挥各自优势,共同聚焦生成式AI领域,围绕内容创作、商…

【永洪BI】管理系统

管理系统模块包括系统设置、认证授权、日志管理、监控预警、资源部署、VooltDB管理、数据库管理、企业应用配置、系统检查、应用管理模块。 系统设置界面: 可以进行清除系统缓存、配置系统主题、配置系统邮箱、配置门户主页、配置权限管理系统、配置密码策略、配置…