归并排序法解释

news2024/12/29 11:43:04

在这里插入图片描述

什么是归并排序法

归并排序是一种常见的排序算法,它基于分治策略,将一个大问题分解为小问题来解决。归并排序的主要思想是将待排序的数组分成两个子数组,分别对这两个子数组进行排序,最后将两个有序的子数组合并成一个有序的数组。
在这里插入图片描述
具体步骤如下:

  1. 将待排序的数组不断地二分,直到每个子数组只剩下一个元素为止(即子数组长度为1)。
  2. 对每个子数组进行排序,可以使用递归来完成。递归结束条件是子数组中只有一个元素,此时认为它已经是有序的。
  3. 将两个有序的子数组合并成一个有序的数组。合并过程中,比较两个子数组中的元素,将较小的元素放入新的数组,并将其指针后移一位,直到一个子数组的所有元素都被合并完毕。然后将另一个子数组中剩下的元素直接复制到新的数组中。

归并排序的关键思想是分治和合并。分治将原问题划分成多个子问题,通过递归地解决每个子问题,最终得到解。合并将子问题的解合并成原问题的解。

归并排序的时间复杂度始终为O(nlogn),其中n是待排序数组的长度。这是因为每次合并操作需要线性的时间复杂度O(n),而每次递归调用将数组大小减半,所以总共需要logn次递归调用。

归并排序是一种稳定的排序算法,它适用于各种规模的数组排序问题。由于归并排序的稳定性和较低的时间复杂度,它在实际应用中被广泛使用。

代码演示

def merge_sort(arr):
    if len(arr) <= 1:
        return arr

    # 将数组二分为两个子数组
    mid = len(arr) // 2
    left = arr[:mid]
    right = arr[mid:]

    # 递归地对子数组进行排序
    left = merge_sort(left)
    right = merge_sort(right)

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

def merge(left, right):
    merged = []
    i = j = 0

    # 比较两个子数组中的元素,并按顺序合并
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            merged.append(left[i])
            i += 1
        else:
            merged.append(right[j])
            j += 1

    # 将剩余的子数组中的元素添加到合并数组中
    merged.extend(left[i:])
    merged.extend(right[j:])

    return merged

# 测试代码
arr = [9, 5, 1, 3, 8, 4, 7, 2, 6]
sorted_arr = merge_sort(arr)
print(sorted_arr)

这段代码通过递归实现了归并排序。首先将数组分为两个子数组,然后递归地对子数组进行排序。最后,调用merge函数将两个有序的子数组合并成一个有序的数组。在merge函数中,我们使用两个指针i和j分别指向左子数组和右子数组,通过比较元素大小来确定合并的顺序。最后,将剩余的元素添加到合并数组中,返回最终的有序数组。

运行上述代码,输出结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9],即为按照升序排列的原始数组。这就是归并排序的算法思想和实现过程。

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

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

相关文章

Openlayers入门,Openlayers调整中心点坐标、Openlayers调整缩放级别、Openlayers调整地图可视角度和地图复位

专栏目录: OpenLayers入门教程汇总目录 前言 本章介绍一下Openlayers最基础的调整中心点坐标方式、调整缩放级别、调整地图可视角度和地图复位的小功能示例,非常简单,可直接上手。 二、依赖和使用 "ol": "^6.15.1"使用npm安装依赖npm install ol@6…

重学C++系列之继承

一、什么是继承 继承是面向对象三大特性之一&#xff0c;C中&#xff0c;被继承的类称为基类&#xff08;父类&#xff09;&#xff0c;继承别的类的类成为派生类&#xff08;子类&#xff09;&#xff0c;继承除了基类的构造函数和析构函数不继承外&#xff0c;其余成员全部继…

【安卓】视频播放器实现过程,超详细注释,自定义视频进度条,打开本地文件播放视频等功能。

一、实现效果 废话不多说&#xff0c;直接上代码&#xff0c;里面有详细注释&#xff0c;不清楚的评论区留言。 二、布局代码 <?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res…

Android安卓实战项目(3)—一个炫酷的健身APP界面

Android安卓实战项目&#xff08;3&#xff09;—一个炫酷的健身APP界面 一.项目运行介绍 1.大致浏览 2.功能介绍 &#xff08;1&#xff09;功能一 上导航条 &#xff08;2&#xff09;功能二 下导航条 二.具体实现 MainActivity.java package com.rckdeveloper.fitene…

python 面向对象编程的特点 - 封装 - 继承(经典类、新式类) - 多态 - 静态方法、类方法 - 下划线的使用 - 回合制攻击游戏实验

目录 面向对象编程的特点&#xff1a; 封装&#xff1a;封装是将数据和操作&#xff08;方法&#xff09;封装在一个对象中的能力 继承&#xff1a;继承是指一个类&#xff08;子类&#xff09;可以继承另一个类&#xff08;父类&#xff09;的属性和方法。 我们为什么需要继…

Python采集法外狂徒张三所有视频【含jS逆向解密】

传说中&#xff0c;有人因为只是远远的看了一眼法外狂徒张三就进去了&#x1f602; 我现在是获取他视频&#xff0c;岂不是直接终生了&#x1f929; 网友&#xff1a;赶紧跑路吧 &#x1f60f; 好了话不多说&#xff0c;我们直接开始今天的内容吧&#xff01; 你需要准备 …

详解STM32的GPIO八种输入输出模式,GPIO各种输入输出的区别、初始化的步骤详解,看这文章就行了(超详细)

在STM32微控制器中&#xff0c;常见的输入输出(GPIO)模式有八种&#xff0c;分别是推挽输出、开漏输出、复用推挽输出、复用开漏输出、浮空输入、上拉输入、下拉输入和模拟输入。下面我将为你解释每种模式的特点和区别&#xff0c;并提供相应的示例代码。 文章目录 介绍区别初…

组合模式-树形结构的处理

A公司需要筛选出年龄35岁及以上(如果是领导&#xff0c;年龄为45岁及以上)的人。其组织架构图如下。 图 A公司部分组织架构图 图 传统解决方案 public class Development {private String name;public Development(String name) {this.name name;}List<Employee> emplo…

uni-app优雅的实现时间戳转换日期格式

现在显示的格式如下图&#xff1a; 我期望统一格式&#xff0c;所以不妨前端处理一下&#xff0c;核心代码如下 filters: {// 时间戳处理formatDate: function(value, spe /) {value value * 1000let data new Date(value);let year data.getFullYear();let month data.…

【设计模式——学习笔记】23种设计模式——适配器模式Adapter(原理讲解+应用场景介绍+案例介绍+Java代码实现)

介绍 生活中的案例 不同国家的插座不同&#xff0c;出国旅游充电器不能直接使用&#xff0c;可以通过使用多功能转换插头来辅助使用 基础介绍 适配器模式将某个类的接口转换成客户端期望的另一个接口表示&#xff0c;主的目的是兼容性&#xff0c;让原本因接口不匹配不能一起…

github gitlab 多用户多平台切换

一、背景 我需要用账号1 来登录并管理github 账号 我需要用账号2 来登录并管理gitlab 账号 二、设置账号 邮箱 设置账号1用户名与邮箱 git config --global user.name "miaojiang" git config --global user.email "187133163.com" 三、生成本地密钥…

LT6911C 是一款HDMI 1.4到双端口MIPIDSI/CSI或者LVDS加音频的一款高性能芯片

LT6911C 1.描述&#xff1a; LT6911C是一款高性能的HDMI1.4到MIPIDSI/CSI/LVDS芯片&#xff0c;用于VR/智能手机/显示器应用程序。对于MIPIDSI/CSI输出&#xff0c;LT6911C具有可配置的单端口或双端口MIPIDSI/CSI&#xff0c;具有1个高速时钟通道和1个~4个高速数据通道&#…

ChatGLM-RM(Reward Model)实现代码逐行讲解

这里我们尝试通过RM训练让模型学会从给定上下文中提取信息&#xff0c;来进行RM模型的实践。你可以从下面链接获取代码 GitHub - Pillars-Creation/ChatGLM-RLHF-LoRA-RM: ChatGLM-6B添加了RLHF的实现&#xff0c;以及部分核心代码的逐行讲解 ,实例部分是做了个新闻短标题的生成…

入行软件测试7年,才知道原来字节跳动这么容易进

当前就业环境&#xff0c;裁员、失业消息满天飞&#xff0c;好像有一份工作就不错了&#xff0c;更别说高薪了。其实这只是一方面&#xff0c;而另一方面&#xff0c;各大企业依然求贤若渴&#xff0c;高技术人才依然紧缺&#xff0c;只要你技术过硬&#xff0c;拿个年薪50w不是…

FUNBOX_1靶场详解

FUNBOX_1靶场复盘 这个系列的靶场给出的干扰因素都挺多的&#xff0c;必须从中找到有用的线索才可以。 这个靶场你扫描到ip地址后打开网页会发现&#xff0c;ip自动转换成域名了&#xff0c;所以我们需要添加一条hosts解析才可以。 192.168.102.190 funbox.fritz.box从目录…

4EVERLAND 托管让 Permaweb 变得更容易!

在互联网托管领域&#xff0c;我们通常将其与存储和管理网站的服务联系起来。传统的 Web2 托管服务在集中式服务器模型上运行&#xff0c;其中网站文件和数据库存储在集中管理的服务器上。用户通过互联网访问网站。这种托管模式应用广泛&#xff0c;相对简单&#xff0c;适合很…

计算机存储结构、执行速度及对应用的影响

万丈高楼&#xff0c;平地起。 计算机世界的信息化软件工程&#xff0c;是构筑于计算机硬件之上的。 由于信息的流转依托于计算机不同的部件&#xff0c;所以计算机系统的内部设计、各类应用架构无不受部件之间速度差异的影响。 本文&#xff0c;主要先介绍存储体系&#xff0c…

Spring Security 授权体系结构

目录 1、Authorities 授权&#xff08;AuthorizationFilter 过滤器&#xff09; 2、AuthorizationManager 授权管理器 3、角色的层次化&#xff08;Roles&#xff09; 1、Authorities 授权&#xff08;AuthorizationFilter 过滤器&#xff09; 通过 Authentication.getAutho…

Spring基础知识讲解

文章目录 Spring是什么&#xff1f;IoC容器与DIDI与IoC的区别 Spring项目的创建配置maven国内源创建Spring项目有关Bean的操作存储Bean使用Bean ApplicationContext和BeanFactory的区别getBean()的三种使用方法 更简单的存储和获取对象类注解方法注解获取Bean对象的简单方法——…

Ubuntu18.04下安装ROS

安装相关依赖 sudo apt install ninja-build exiftool ninja-build protobuf-compiler libeigen3-dev genromfs xmlstarlet libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev python-pip python3-pip ----------------------------------------------------------------…