【算法系列】归并排序详解

devtools/2025/2/26 17:52:21/

文章目录

  • 归并排序详解
    • 1. 基本原理
      • 1.1 分治法策略
      • 1.2 归并排序步骤
      • 1.3 图解示例
    • 2. 时间复杂度与空间复杂度
      • 2.1 时间复杂度
      • 2.2 空间复杂度
    • 3. 稳定性
    • 4. Java 实现示例
    • 5. 归并排序的优点与缺点
      • 5.1 优点
      • 5.2 缺点
    • 6. 总结

归并排序详解

归并排序(Merge Sort)是一种基于分治法的经典排序算法。它通过递归地将数组分成较小的子数组,分别对这些子数组进行排序,然后将它们合并以产生最终的有序数组。归并排序以其稳定性和在最坏情况下的高效性能而著称。

1. 基本原理

1.1 分治法策略

归并排序的核心思想是分治法,即将一个问题分解成若干个规模更小但类似的子问题,递归地解决这些子问题,然后将结果合并以得到原问题的解。

1.2 归并排序步骤

  1. 分割:将数组不断分割成两个大致相等的部分,直到每个部分只有一个元素。
  2. 排序:对每个单独的元素视为已排序的部分。
  3. 合并:将两个已排序的子数组合并成一个更大的已排序数组,直到整个数组排序完成。

1.3 图解示例

假设我们有一个数组 [8, 4, 5, 7, 1, 3, 6, 2],以下是归并排序的过程:
在这里插入图片描述

2. 时间复杂度与空间复杂度

2.1 时间复杂度

  • 最好、平均和最坏情况:O(n log n)
  • 每次分割操作的时间复杂度为 O(log n),每次合并操作的时间复杂度为 O(n)。

2.2 空间复杂度

  • 空间复杂度:O(n)
  • 需要额外的空间来存储临时数组,在合并过程中使用。

3. 稳定性

归并排序是稳定的排序算法,即相同值的相对位置不会改变。

4. Java 实现示例

java">public static void mergeSort(int[] arr) {int[] temp = new int[arr.length];mergeSort(arr, 0, arr.length - 1, temp);
}private static void mergeSort(int[] arr, int l, int r, int[] temp) {if(l < r) {int m = (l + r) / 2;mergeSort(arr, l, m, temp);mergeSort(arr, m + 1, r, temp);merge(arr, l, m, r, temp);}
}private static void merge(int[] arr, int l, int m, int r, int[] temp) {int i = l; // 左序列指针int j = m + 1; // 右序列指针int k = l;while(i <= m && j <= r) {if(arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}// 左序列剩余元素填充至临时数组while(i <= m) {temp[k++] = arr[i++];}// 右序列剩余元素填充至临时数组while(j <= r) {temp[k++] = arr[j++];}// 将临时数组的数据拷贝至原数组k = l;while(k <= r) {arr[k] = temp[k++];}
}

5. 归并排序的优点与缺点

5.1 优点

稳定性:归并排序是稳定的排序算法,适合对稳定性有要求的应用场景。
时间复杂度:无论数据是否有序,归并排序的时间复杂度始终为 O(n log n),这使得它在处理大规模数据时表现良好。
适用范围广:适用于各种类型的数据集,尤其是当数据量较大且需要稳定排序时。

5.2 缺点

空间复杂度较高:归并排序需要额外的 O(n) 空间来存储临时数组,这在内存有限的情况下可能是一个限制。
递归调用栈深度:递归调用栈的深度为 O(log n),在极端情况下可能导致栈溢出。

6. 总结

归并排序是一种非常高效的排序算法,特别适合处理大规模数据集。尽管它的空间复杂度较高,但由于其稳定性和一致的时间复杂度,使其成为许多实际应用中的首选排序算法之一。


http://www.ppmy.cn/devtools/162846.html

相关文章

【蓝桥杯单片机】第十三届省赛第二场

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数&#xff08;led.c&#xff09; void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…

RAGS评测后的数据 如何利用influxdb和grafan 进行数据汇总查看

RAGS(通常指相关性、准确性、语法、流畅性)评测后的数据能借助 InfluxDB 存储,再利用 Grafana 进行可视化展示,实现从四个维度查看数据,并详细呈现每个问题对应的这四个指标情况。以下是详细步骤: 1. 环境准备 InfluxDB 安装与配置 依据自身操作系统,从 InfluxDB 官网下…

反向代理模块kfj

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

50周学习go语言:第五周 复合类型与词频统计

以下是第五周复合类型&#xff08;数组、切片与映射&#xff09;的详细学习内容&#xff0c;按照第四周的深度要求设计&#xff1a; 第五周&#xff1a;复合类型与词频统计 一、复合类型详解 1. 数组&#xff08;Array&#xff09; // 声明与初始化 var arr1 [3]int …

三星Galaxy S24系列手机被曝3月推送One UI 7稳定版更新

在智能手机的激烈竞争中&#xff0c;系统更新往往是决定用户体验的关键因素之一。2025年2月22日&#xff0c;一则振奋人心的消息在科技圈传开&#xff1a;三星计划于今年3月&#xff0c;向Galaxy Z Fold6、Galaxy Z Flip6折叠手机以及Galaxy S24系列推送One UI 7稳定版更新。这…

计算机视觉基础 | 数据增强技术:AutoAugment

一、引言 在深度学习领域&#xff0c;数据就如同模型的 “燃料”&#xff0c;其数量和质量对模型性能有着至关重要的影响。数据增强&#xff08;Data Augmentation&#xff09;技术应运而生&#xff0c;它通过对原始数据进行一系列变换操作&#xff0c;如裁剪、旋转、翻转、颜…

PHP爬虫能处理JSON数据吗?

是的&#xff0c;PHP爬虫完全可以处理JSON数据。PHP提供了强大的内置函数来解析和生成JSON数据&#xff0c;使得处理API返回的JSON格式数据变得非常简单和高效。以下是如何在PHP中处理JSON数据的详细说明和示例。 1. 解析JSON数据 当从API获取到JSON格式的响应后&#xff0c;可…

计算机视觉:经典数据格式(VOC、YOLO、COCO)解析与转换(附代码)

第一章&#xff1a;计算机视觉中图像的基础认知 第二章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(一) 第三章&#xff1a;计算机视觉&#xff1a;卷积神经网络(CNN)基本概念(二) 第四章&#xff1a;搭建一个经典的LeNet5神经网络(附代码) 第五章&#xff1…