【排序算法】深入理解归并排序算法:从原理到实现

目录

1. 引言

2. 归并排序算法原理

3. 归并排序的时间复杂度分析

4. 归并排序的应用场景

5. 归并排序的优缺点分析

5.1 优点:

5.2 缺点:

6. Java、JavaScript 和 Python 实现归并排序算法

6.1 Java 实现:

6.2 JavaScript 实现:

6.3 Python 实现:

7. 总结


1. 引言

        归并排序是一种经典的排序算法,它的核心思想是分治和递归。通过将待排序序列分割成若干个子序列,分别对子序列进行排序,然后将排好序的子序列合并成有序序列。本文将从原理、时间复杂度、应用场景、优缺点等方面深入探讨归并排序算法,并通过 Java、JavaScript 和 Python 三种编程语言的示例进行说明。

2. 归并排序算法原理

归并排序算法的核心思想是先分后治。具体来说,它将待排序序列分割成两个子序列,分别对这两个子序列进行递归排序,然后将排好序的子序列合并成一个有序序列。

归并排序的步骤如下:

  1. 分割:将待排序序列分割成两个子序列,直到子序列长度为1。
  2. 排序:对分割后的子序列进行递归排序。
  3. 合并:将排好序的子序列合并成一个有序序列。

3. 归并排序的时间复杂度分析

       归并排序算法的时间复杂度与分割策略有关。在分割过程中,每次都将序列分割成两个长度大致相等的子序列,因此时间复杂度为O(log n)。在合并过程中,需要将两个有序子序列合并成一个有序序列,时间复杂度为O(n)。因此,归并排序的时间复杂度为O(n log n)。

4. 归并排序的应用场景

         归并排序算法适用于处理大规模数据的排序问题,特别是在需要稳定排序或外部排序的场景下。由于归并排序的时间复杂度较低,因此在需要高效率排序的场景下广泛应用。

                                                                                               

5. 归并排序的优缺点分析

5.1 优点:

  • 时间复杂度低:归并排序的时间复杂度为O(n log n),效率较高。
  • 稳定性:归并排序是一种稳定的排序算法,相同元素的相对位置不会改变。
  • 适用性广泛:归并排序适用于各种数据类型和数据规模,特别适合处理大规模数据。

5.2 缺点:

  • 需要额外的空间:归并排序需要额外的空间来存储临时序列,因此在内存有限的情况下可能会受到限制。
  • 递归调用开销大:归并排序的实现通常采用递归方式,递归调用开销较大,可能会影响性能。

6. Java、JavaScript 和 Python 实现归并排序算法

6.1 Java 实现:

import java.util.Arrays;public class MergeSort {public static void mergeSort(int[] arr, int left, int right) {if (left < right) {int mid = (left + right) / 2;mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}}public static void merge(int[] arr, int left, int mid, int right) {int[] temp = new int[right - left + 1];int i = left, j = mid + 1, k = 0;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}for (int p = 0; p < temp.length; p++) {arr[left + p] = temp[p];}}public static void main(String[] args) {int[] arr = {12, 11, 13, 5, 6};mergeSort(arr, 0, arr.length - 1);System.out.println("Sorted array: " + Arrays.toString(arr));}
}

6.2 JavaScript 实现:

function mergeSort(arr, left, right) {if (left < right) {let mid = Math.floor((left + right) / 2);mergeSort(arr, left, mid);mergeSort(arr, mid + 1, right);merge(arr, left, mid, right);}
}function merge(arr, left, mid, right) {let temp = [];let i = left, j = mid + 1, k = 0;while (i <= mid && j <= right) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}while (i <= mid) {temp[k++] = arr[i++];}while (j <= right) {temp[k++] = arr[j++];}for (let p = 0; p < temp.length; p++) {arr[left + p] = temp[p];}
}let arr = [12, 11, 13, 5, 6];
mergeSort(arr, 0, arr.length - 1);
console.log("Sorted array: " + arr);

6.3 Python 实现:

def mergeSort(arr, left, right):if left < right:mid = (left + right) // 2mergeSort(arr, left, mid)mergeSort(arr, mid + 1, right)merge(arr, left, mid, right)def merge(arr, left, mid, right):temp = [0] * (right - left + 1)i = leftj = mid + 1k = 0while i <= mid and j <= right:if arr[i] <= arr[j]:temp[k] = arr[i]i += 1else:temp[k] = arr[j]j += 1k += 1while i <= mid:temp[k] = arr[i]i += 1k += 1while j <= right:temp[k] = arr[j]j += 1k += 1for p in range(len(temp)):arr[left + p] = temp[p]arr = [12, 11, 13, 5, 6]
mergeSort(arr, 0, len(arr) - 1)
print("Sorted array:", arr)

7. 总结

        通过本文的介绍,我们对归并排序算法有了更深入的理解。从原理到实现,再到时间复杂度分析、应用场景、优缺点等方面,我们对归并排序算法有了全面的认识。同时,通过用 Java、JavaScript 和 Python 三种编程语言实现归并排序算法,我们加深了对这些语言特性和语法的理解,提高了编程能力。

       归并排序算法是一种稳定且效率较高的排序算法,在处理大规模数据时表现良好。它适用于各种数据类型和数据规模,特别适合需要稳定排序或外部排序的场景。

       希望本文能够帮助读者更好地理解归并排序算法,并在实践中灵活运用,解决实际问题。同时也希望读者能够继续深入学习和探索,不断提升自己的算法能力和编程技术。

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

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

相关文章

OpenCV 4基础篇| OpenCV图像的裁切

目录 1. Numpy切片1.1 注意事项1.2 代码示例 2. cv2.selectROI()2.1 语法结构2.2 注意事项2.3 代码示例 3. Pillow.crop3.1 语法结构3.2 注意事项3.3 代码示例 4. 扩展示例&#xff1a;单张大图裁切成多张小图5. 总结 1. Numpy切片 语法结构&#xff1a; retval img[y:yh, x…

Vue开发实例(六)实现左侧菜单导航

左侧菜单导航 一、一级菜单二、二级菜单三、三级菜单1、加入相关事件 四、菜单点击跳转1. 创建新页面2. 配置路由3. 菜单中加入路由配置4、处理默认的Main窗口为空的情况 五、动态左侧菜单导航1、动态实现一级菜单2、动态实现二级菜单 一、一级菜单 在之前的Aside.vue中去实现…

C#实现快速排序算法

C#实现快速排序算法 以下是C#中的快速排序算法实现示例&#xff1a; using System;class QuickSort {// 快速排序入口函数public static void Sort(int[] array){QuickSortRecursive(array, 0, array.Length - 1);}// 递归函数实现快速排序private static void QuickSortRecu…

结合大象机器人六轴协作机械臂myCobot 280 ,解决特定的自动化任务和挑战!(上)

项目简介 本项目致力于探索和实现一种高度集成的机器人系统&#xff0c;旨在通过结合现代机器人操作系统&#xff08;ROS&#xff09;和先进的硬件组件&#xff0c;解决特定的自动化任务和挑战。一部分是基于Jetson Orin主板的LIMO PPRO SLAM雷达小车&#xff0c;它具备自主导航…

2.Rust变量

变量的声明 let关键字 在Rust中变量必须要先声明才能使用&#xff0c;let关键字用于声明变量并将一个值绑定到该变量上。如下: fn main() {let var_name:i32 123123;println!("{}",var_name) //println! 是一个宏&#xff08;macros&#xff09;&#xff0c;可以…

C#与欧姆龙PLC实现CIP通讯

参考文档&#xff1a; 欧姆龙PLC使用-CSDN博客 CIP通讯介绍&#xff08;欧姆龙PLC&#xff09;-CSDN博客 使用NuGet添加引用&#xff1a;CIPCompolet 基础参考我的CIP协议介绍&#xff0c;默认TCP端口为&#xff1a;44818 类NXCompolet 类的功能可以在安装PLC开发软件后帮…

【Transformer】single self-attention的理解与计算步骤

参考B站Enzo_Mi老师 【self-Attention&#xff5c;自注意力机制 &#xff5c;位置编码 &#xff5c; 理论 代码】https://www.bilibili.com/video/BV1qo4y1F7Ep?vd_source19425b683f74eeac34bde8ddf968a0d6 建议大家去看老师的原视频&#xff0c;讲解非常清晰&#xff0c;这里…

类和对象-继承

师从黑马程序员 基本语法 有些类与类之间存在特殊的关系&#xff0c;例如&#xff1a; 定义这些类时&#xff0c;下一级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这时候我们就可以考虑继承技术&#xff0c;减少重复代码 语法&#xff1a;class 子类&…

【鸿蒙 HarmonyOS 4.0】应用状态:LocalStorage/AppStorage/PersistentStorage

一、介绍 如果要实现应用级的&#xff0c;或者多个页面的状态数据共享&#xff0c;就需要用到应用级别的状态管理的概念。 LocalStorage&#xff1a;页面级UI状态存储&#xff0c;通常用于UIAbility内、页面间的状态共享。AppStorage&#xff1a;特殊的单例LocalStorage对象&…

Android Studio下载gradle超时问题解决

方法一 1. 配置根目录的setting.gradle.kts文件 pluginManagement {repositories {maven { urluri ("https://www.jitpack.io")}maven { urluri ("https://maven.aliyun.com/repository/releases")}maven { urluri ("https://maven.aliyun.com/repos…

【Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令】

Pytorch、torchvision、CUDA 各个版本对应关系以及安装指令 1、名词解释 1.1 CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;是由NVIDIA开发的用于并行计算的平台和编程模型。CUDA旨在利用NVIDIA GPU&#xff08;图形处理单元&#xff09;的强大计算…

SpringCloudGateway全局过滤器

文章目录 全局过滤器的作用自定义全局过滤器过滤器执行的顺序 上一篇 Gateway理论与实践 介绍的过滤器&#xff0c;网关提供了31种&#xff0c;但每一种过滤器的作用都是固定的。如果我们希望拦截请求&#xff0c;做自己的业务逻辑则没办法实现。 全局过滤器的作用 全局过滤器的…

App前端开发跨平台框架比较:React Native、Flutter、Xamarin等

引言 移动应用开发领域的跨平台框架正在不断演进&#xff0c;为开发者提供更多选择。在本文中&#xff0c;我们将比较几个流行的跨平台框架&#xff1a;React Native、Flutter和Xamarin等。讨论它们的优缺点、适用场景以及开发体验。 第一部分 React Native: 优缺点、适用场景…

大模型时代下的自动驾驶研发测试工具链-SimCycle

前言&#xff1a; 最近OpenAI公司的新产品Sora的发布&#xff0c;正式掀起了AI在视频创作相关行业的革新浪潮&#xff0c;AI不再仅限于文本、语音和图像&#xff0c;而直接可以完成视频的生成&#xff0c;这是AI发展历程中的又一座重要的里程碑。AI正在不断席卷着过去与我们息…

接口自动化框架(Pytest+request+Allure)

前言&#xff1a; 接口自动化是指模拟程序接口层面的自动化&#xff0c;由于接口不易变更&#xff0c;维护成本更小&#xff0c;所以深受各大公司的喜爱。 接口自动化包含2个部分&#xff0c;功能性的接口自动化测试和并发接口自动化测试。 本次文章着重介绍第一种&#xff0c…

python学习the sixth day

python函数进阶 一、函数多返回值 二、函数的多种参数使用 1.位置参数 2.关键字参数 3.缺省参数 设置默认值&#xff0c;必须放在最后面 4.不定长参数 4.总结 三、匿名函数 1.函数作为参数传递 这是计算逻辑的传递&#xff0c;而非数据的传递 2.lambda匿名函数 python文件操…

【vue.js】文档解读【day 3】 | 条件渲染

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 文章目录 条件渲染前言&#xff1a;v-ifv-elsev-else-iftemplate中的v-ifv-showv-if vs v-show 条件渲染 前言&#xff1a; 在JavaScript中&#xff0c;我们知道条件控制语句可以控制程序的走向&#…

ReactNative项目构建分析与思考之react-native-gradle-plugin

前一段时间由于业务需要&#xff0c;接触了下React Native相关的知识&#xff0c;以一个Android开发者的视角&#xff0c;对React Native 项目组织和构建流程有了一些粗浅的认识&#xff0c;同时也对RN混合开发项目如何搭建又了一点小小的思考。 RN环境搭建 RN文档提供了两种…

阿珊详解Vue Router的守卫机制

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

用一个 Python 脚本实现依次运行其他多个带 argparse 命令行参数的 .py 文件

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 问题描述&#xff1a;在 Windows 环境中&#xff0c;您希望通过一个 Python 脚本来实现特定的自动化任务&#xff0c;该任务需要依次运行其他多个带 argparse 命令行参数的 .py 文件。您希望找到一种简…