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

一、归并排序简介

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

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

归并排序的操作过程:

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

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

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

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

图片

二、Python代码实现 

# -*- coding: utf-8 -*-
"""
小黑测试员
======================================File Name  :merge_sort.pyAuthor     :lanmingyongdate       :2024/5/15 14:39Description:归并排序是一种基于分治策略的有效且稳定的排序算法。归并排序利用分治法的策略,将一个大的数组拆分成几个小的子数组,这些子数组各自独立地排序,然后逐步合并成一个完全有序的大数组。归并排序的时间复杂度为O(n log n),空间复杂度为O(n),其中n是待排序元素的数量。
=======================================
"""def merge_sort(arr):"""递归方式将数组进行分割,直到数组只有一个元素"""if len(arr) == 1:  # 如果组分割到只剩一个元素时,结束return arrmid = len(arr) // 2  # 将数组分成1/2arr_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_rightprint("每一小组排序结果"+str(result_arr))  # 调试查看每小组排序结果return result_arrif len(arr_right) == 0:result_arr = result_arr + arr_leftprint("每一小组排序结果"+str(result_arr))  # 调试查看每小组排序结果return result_arrif 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.hqwc.cn/news/704576.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日两题 / 236. 二叉树的最近公共祖先 124. 二叉树中的最大路径和(LeetCode热题100)

236. 二叉树的最近公共祖先 - 力扣(LeetCode) dfs统计根节点到p,q节点的路径,两条路径中最后一个相同节点就是公共祖先 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

纯血鸿蒙APP实战开发——Web获取相机拍照图片案例

介绍 本示例介绍如何在HTML页面中拉起原生相机进行拍照,并获取返回的图片。 效果预览图 使用说明 点击HTML页面中的选择文件按钮,拉起原生相机进行拍照。完成拍照后,将图片在HTML的img标签中显示。 实现思路 添加Web组件,设置…

(实测验证)【移远EC800M-CN 】GNSS功能打开和关闭关闭步骤验证

引言 本文章使用自研“超小体积TTL转4GGPS集成模块”进行实测验证; 一、打开GNSS功能 步骤一、通过 ATQGPSCFG 配置 GNSS 参数 (1)该命令用于查询和配置 GNSS 不同的设置,包括 NMEA 语句输出端口、NMEA 语句的输出类型等。 1.1…

Trinity部署、使用与原理分析

文章目录 前言1、概述1.1、整体架构1.2、trinity-main1.3、childx 2、安装与使用2.1、源码安装2.1.1 部署系统依赖组件2.1.2 使用源码安装系统 2.2、使用方法 3、测试用例3.1、Splice系统调用压力测试3.2、其它系统调用压力测试3.3、自定义系统调用压力测试 4、总结4.1、部署架…

NVM安装及VUE创建项目的N种方式

VUE 参考官网:https://cli.vuejs.org/zh/guide/ 目录 NVM安装 1.卸载node.js 2.安装nvm ​编辑​ 3.配置 4.使用nvm安装node.js 5.nvm常用命令 创建VUE项目 1.使用vue init 创建vue2(不推荐) 2.使用vue create创建vue2和3&#xff…

redis报错500

之前自己举一反三把value也给序列化了: 然后报错了: 原因是这里传入的是Integer类型,序列化的话就变为string类型了

基于springboot+vue+Mysql的大学生社团活动平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

评价决策类-层次分析法

师从江北 问题引出 归一化处理:指标的数组[a b c]归一化处理得到[a/(abc),b/(abc),c/(abc)] 因为每个指标的重要性不同,所以要加上一个权重 如何科学的确定权重,就要用到层次分析法(AHP) 模型原理 建立递阶层次结构模…

2024最新软件测试【测试理论+ 接口测试】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段:需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样,之后我们会有一个需求澄清会议, …

深度盘点在当今经济形势下资深项目经理或PMO的或去或从

在当今经济形势下,资深项目经理(Project Manager)或项目管理办公室(PMO)的去向和选择受到多种因素的影响。以下是对他们可能面临的或去或从的深度盘点: 1、发展去向 1. 深化专业领域:在经济形势…

AI绘画提示词案例(车

目录 1. 提示词1——复古敞篷车:2. 提示词2——霓虹城市:3. 提示词3——沙滩SUV:4. 网站推荐——LibLib小结: 1. 提示词1——复古敞篷车: 正向提示词: In the quiet suburbs,a vintage-style convertible…

js之选项卡制作实例

大家好&#xff0c;今天给大家书写选项卡实例&#xff0c;话不多说&#xff0c;直接上干货 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…