排序算法介绍(五)归并排序

0. 简介

        归并排序(Merge Sort)是一种分治思想的应用,它将待排序的数组不断拆分成小数组,直到每个小数组只有一个元素,然后将小数组两两合并,直到最终得到有序的数组。


1. 归并排序的实现

归并排序的基本思想:

  1. 分解:将待排序的数组从中间分成两部分,递归地对左右两部分进行分解,直到每个小数组只有一个元素,这时可以认为每个小数组是有序的。
  2. 解决:将两个有序的小数组合并成一个有序的数组。可以使用双指针法,比较两个数组的元素大小,按照从小到大的顺序将元素放入新的数组中。
  3. 合并:递归地将左右两个有序的数组合并成一个更大的有序数组,直到最终得到整个有序数组。

归并排序过程演示:

d0c5b326b4cf4d8aa51c168548c8a4d7.gif


2. 归并排序时空间复杂度分析

归并排序的时间复杂度和空间复杂度分析如下:

  1. 时间复杂度:

    • 归并排序的时间复杂度是 O(n log n),其中 n 是待排序数组的长度。这是因为归并排序采用分治策略,每次将数组分成两半进行递归排序,然后再合并。在每一层递归中,需要对所有元素进行比较和移动,所以每层的时间复杂度是 O(n)。由于递归的深度是 log n,因此总的时间复杂度是 O(n log n)。
  2. 空间复杂度:

    • 归并排序的空间复杂度是 O(n)。这是因为在合并过程中,需要创建一个临时数组来存储两个有序子数组的元素。临时数组的大小与原数组相同,所以空间复杂度是 O(n)。需要注意的是,这个空间复杂度是额外的空间,不包括递归调用所使用的栈空间。如果考虑递归调用的栈空间,最坏情况下的空间复杂度将达到 O(n log n)。

综上所述,归并排序的时间复杂度是 O(n log n),空间复杂度是 O(n)。


3. 归并排序C语言代码

C代码实现:

#include <stdio.h>  // 合并两个有序数组  
void merge(int arr[], int l, int m, int r) {  int i, j, k;  int n1 = m - l + 1;  int n2 = r - m;  // 创建临时数组  int L[n1], R[n2];  // 将数据拷贝到临时数组  for (i = 0; i < n1; i++)  L[i] = arr[l + i];  for (j = 0; j < n2; j++)  R[j] = arr[m + 1 + j];  // 合并临时数组到原数组  i = 0;  j = 0;  k = l;  while (i < n1 && j < n2) {  if (L[i] <= R[j]) {  arr[k] = L[i];  i++;  } else {  arr[k] = R[j];  j++;  }  k++;  }  // 将剩余元素拷贝到原数组  while (i < n1) {  arr[k] = L[i];  i++;  k++;  }  while (j < n2) {  arr[k] = R[j];  j++;  k++;  }  
}  // 归并排序函数  
void mergeSort(int arr[], int l, int r) {  if (l < r) {  int m = l + (r - l) / 2; // 计算中间位置  mergeSort(arr, l, m); // 对左半部分递归排序  mergeSort(arr, m + 1, r); // 对右半部分递归排序  merge(arr, l, m, r); // 合并左右两部分  }  
}  // 测试代码  
int main() {  int arr[] = { 12, 11, 13, 5, 6, 7 };  int arr_size = sizeof(arr) / sizeof(arr[0]);   mergeSort(arr, 0, arr_size - 1); // 对数组进行归并排序  printf("Sorted array:\n");  for (int i = 0; i < arr_size; i++) {  printf("%d ", arr[i]);  }  printf("\n");  return 0;  
}

代码解释:

merge 函数:

  1. int n1 = m - l + 1;int n2 = r - m;:这两行代码计算两个子数组的长度。n1 是左子数组的长度,n2 是右子数组的长度。
  2. int L[n1], R[n2];:我们创建两个临时数组 LR 来存储左子数组和右子数组的元素。
  3. 接下来的两个循环将左子数组和右子数组的元素拷贝到临时数组 LR 中。
  4. 然后,我们使用三个指针 i, j, 和 k 来合并这两个有序的子数组。指针 ij 分别指向临时数组 LR 的当前元素,而指针 k 指向原数组 arr 的当前位置。
  5. 在合并的过程中,我们比较 L[i]R[j] 的值,并将较小的元素放入原数组 arr 中。这个过程会一直持续到我们遍历完 LR 中的所有元素。
  6. 最后,我们将剩余的元素(如果有的话)从 LR 拷贝到原数组 arr 中。

mergeSort 函数:

  1. if (l < r) { ... }:这个条件用于判断数组是否至少包含两个元素。如果只有一个元素或没有元素,那么数组已经是有序的,不需要进一步排序。
  2. int m = l + (r - l) / 2;:这行代码计算数组的中间位置。我们通过将数组的长度 (r - l) 除以 2 并加上起始索引 l 来得到中间位置 m
  3. mergeSort(arr, l, m);mergeSort(arr, m + 1, r);:这两行代码递归地对左子数组和右子数组进行排序。递归的终止条件是子数组的长度为 1 或 0。
  4. merge(arr, l, m, r);:当左子数组和右子数组都被排序后,我们使用 merge 函数将它们合并成一个有序的数组。

4. 归并排序代码运行结果

代码运行结果:

c4f654be288f47748b7faa316b2ebf58.png

 

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

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

相关文章

【2021研电赛】基于EAIDK310的视觉导航自动驾驶小车

本作品介绍参与极术社区的有奖征集|分享研电赛作品扩大影响力&#xff0c;更有重磅电子产品免费领取! 团队价绍 参赛单位&#xff1a;上海应用技术大学 参赛队伍&#xff1a;EAIDK666 指导老师&#xff1a;蒋文萍 丁肇红 参赛队员&#xff1a;温晓静 孙亦劼 杜为栋 获奖情况&a…

JS防抖与节流

防抖 防抖是什么&#xff1f; 单位时间内&#xff0c;频繁触发事件&#xff0c;只执行最后一次 通俗易懂点就是把防抖想象成MOBA游戏的回城&#xff0c;在回城过程中被打断就要重来 例子&#xff1a;我们来做一个效果&#xff0c;我们鼠标在盒子上移动&#xff0c;数字就变化 …

Python爬虫:使用Scrapy框架进行高效爬取

Python爬虫可使用的架构有很多&#xff0c;对于我而言&#xff0c;经常使用Scrapy异步处理框架Twisted&#xff0c;其实意思很明确&#xff0c;Scrapy可以实现多并发处理任务&#xff0c;同一时间将可以处理多个请求并且大大提高工作效率。 Scrapy是一个强大且高效的Python爬虫…

鸿蒙Watch 页面跳转

新建页面 config.json 回自动注册 添加跳转 <button type"capsule" onclick"toStatusMonitor">状态检测</button>写跳转方法 import router from system.router;export default {data: {},onInit() {},onShow() {},toStatusMonitor() {rou…

深度学习——第3章 Python程序设计语言(3.2 Python程序流程控制)

无论是在机器学习还是深度学习中&#xff0c;Python已经成为主导性的编程语言。而且&#xff0c;现在许多主流的深度学习框架&#xff0c;例如PyTorch、TensorFlow也都是基于Python。本课程主要是围绕“理论实战”同时进行&#xff0c;所以本章将重点介绍深度学习中Python的必备…

pandas、numpy的几个示例

这里写自定义目录标题 Pandas 示例NumPy 示例数据分析案例: Iris 数据集 Pandas 示例 Pandas 是一个数据处理和分析的库&#xff0c;它提供了 DataFrame 和 Series 这两种主要数据结构。 # 从字典创建 DataFrame import pandas as pd# 创建一个字典 data {Name: [Alice, Bob…

C++学习之路(十七)C++ 用Qt5实现一个工具箱(增加托盘图标并且增加显示和退出菜单)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《为屏幕颜色提取功能增加一个点击复制的功能》功能。今天我们增加一个比较正式点的功能&#xff0c;就是增加托盘图标并且增加显示和退出菜单&#xff08;越来越像回事了吧 &#x1f601; &#xff09;。下面我们就来…

【CMD】关于在for中SET变量失效的问题

如题&#xff0c;在for中进行一些细化操作时发现SET变量一直不成功(尤其在读取文件时)   简单搜了下看到有个帖子(BAT求助与讨论-SET变量失效)是讨论这个问题的&#xff0c;然后有个老哥给出的解答&#xff0c;其中使用了使用CALL&#xff0c;这让我想起几天前看到的一个博客…

Linux4.7、环境变量

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 基本概念 见见环境变量 指令原理 常见环境变量及其测试 环境变量相关指令 环境变量组织方式 通过代码获取环境变量 通过系统变量获取环境变量以及设置环境变量 环境变量的全局属性 基本概念 首先&#xff0c;…

什么?居然可以免费使用Jetbrains?!

JetBrains是一家捷克的软件开发公司&#xff0c;该公司位于捷克的布拉格&#xff0c;并在俄罗斯的圣彼得堡及美国麻州波士顿都设有办公室&#xff0c;该公司最为人所熟知的产品是Java编程语言开发撰写时所用的集成开发环境&#xff1a;IntelliJ IDEA。 如下是jetbrains旗下的产…

【笔记】Clion 中运行 C/C++11 之 CMakeLists.txt 的配置

该文章记录第一次使用 Clion 时&#xff0c;对 CMakeLists 的配置&#xff0c;使其能够运行 C/C11 的代码。 一. CMakeLists.txt 的配置 1、首先我们在需要新建一个项目 2、填写新建项目相关的信息 3、修改 CMakeLists.txt 文件内容 替换文本&#xff1a; # 使用此 CMakeLis…

帆软报表不能增加SAP连接方式 通过插件一致性检测 同步至本地解决

帆软报表开发人员需要增加一个SAP数据连接方式&#xff1a;SAP_ECC_600环境 在服务器端不能直接增加&#xff0c;而在帆软报表设计器切换到远程模式时&#xff0c;又不能显示SAP连接&#xff0c;导致不能增加。 解决&#xff1a;重新进入帆软报表报计器时报以下错误&#xff0c…

开源运维监控系统-Nightingale(夜莺)应用实践(未完)

一、前言 某业务系统因OS改造,原先的Zabbix监控系统推倒后未重建,本来计划用外部企业内其他监控系统接入,后又通知需要自建才能对接,考虑之前zabbix的一些不便,本次计划采用一个类Prometheus的监控系统,镜调研后发现Nightingale兼容Prometheus,又有一些其他功能增强,又…

从马帮到金蝶云星空通过接口配置打通数据

从马帮到金蝶云星空通过接口配置打通数据 接入系统&#xff1a;马帮 上海马帮科技有限公司&#xff0c;是一家专注于提供全流程跨境电商ERP管理软件解决方案的企业。聚焦服务于各阶段、各领域的跨境电商从业者&#xff0c;旗下包含专业版ERP、亚马逊专用版ERP、东南亚海外版ERP…

JavaScript空值合并运算符

The Nullish Coalescing Operator&#xff08;空值合并运算符&#xff09;是一种 JavaScript 的新运算符&#xff0c;用于解决默认值设定中存在的一些问题。它的语法为 ??&#xff08;两个问号&#xff09;&#xff0c;表示当左侧的操作数为 null 或 undefined 时&#xff0c…

【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)spring boot项目搭建、vue项目搭建、微信小程序项目搭建

项目笔记为项目总结笔记,若有错误欢迎指出哟~ 【项目专栏】 【java+vue+微信小程序项目】从零开始搭建——健身房管理平台(1)项目搭建 持续更新中… java+vue+微信小程序项目】从零开始搭建——健身房管理平台 项目简介Java项目搭建(IDEA)1.新建项目2.项目类型3.项目设置4…

mysql基础语句

【select查询】 1、Select * from 表名; 查询 例&#xff1a; Where 限定的条件查询 AND 连接两个或者多个查询条件 OR 连接两个或者多个查询条件&#xff0c;满足其中一个就可以查询出 2、Select * from 表名 where 字段 某某条件&#xff1b; 例&#xff1a; 3、Selec…

EasyRecovery易恢复2024最新免费版电脑数据恢复软件功能介绍

EasyRecovery从&#xff08;易恢复2024&#xff09;支持恢复不同存储介质数据&#xff0c;在Windows中恢复受损和删除文件,以及能检索数据格式化或损坏卷&#xff0c;甚至还可以从初始化磁盘。同时&#xff0c;你只需要最简单的操作就可以恢复数据文件&#xff0c;如&#xff1…

kubeadm 安装k8s1.28.x 底层走containerd 容器

1. k8s1.28.x 的概述 1.1 k8s 1.28.x 更新 Kubernetes v1.28 是 2023 年的第二个大版本更新&#xff0c;包含了 46 项主要的更新。 而今年发布的第一个版本 v1.27 有近 60 项&#xff0c;所以可以看出来&#xff0c;在发布节奏调整后&#xff0c; 每个 Kubernetes 版本中都会包…

DeepSort知识整理:余弦距离和马氏距离 (一)

一、余弦距离 1.1 余弦相似度 余弦相似度是用来衡量两个非零向量之间的夹角的余弦值。对于两个向量 A A A 和 B B B&#xff0c;余弦相似度的计算公式为&#xff1a; C o s i n e S i m i l a r i t y ( A , B ) A ⋅ B ∥ A ∥ ∥ B ∥ {\rm{Cosine Similarity }}\left( …