数据结构-归并排序笔记



【数据结构】八大排序(超详解+附动图+源码)_数据结构排序-CSDN博客

看这个学思路

一  归并排序介绍:


归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

二  实现思路

  1. 分解(Divide)

    • 将待排序的序列分割成若干个子序列,这些子序列可以是顺序的,也可以是随机的。
    • 分解的标准通常是按照序列的中间位置或者某个特定的划分点来划分序列。
  2. 解决(Conquer)

    • 递归地对每个子序列进行排序。
    • 递归的基本情况是当子序列足够小,可以直接排序或者已经有序,不需要进一步分解。
  3. 合并(Combine)

    • 将排序好的子序列合并成一个有序的完整序列。
    • 合并操作的复杂度通常取决于具体的算法,例如归并排序中的合并操作需要将两个有序序列合并成一个有序序列。

三  代码实现

public class Main {

    public static void main(String[] args) {
        int[] arr = {11, 44, 23, 67, 88, 65, 34, 48, 9, 12}; // 待排序数组
        int[] tmp = new int[arr.length]; // 新建一个临时数组,用于在归并过程中存放元素
        
        mergeSort(arr, 0, arr.length - 1, tmp); // 调用归并排序方法,传入数组、起始索引、结束索引和临时数组

        // 输出排序后的数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    // 归并排序方法,采用递归实现
    private static void mergeSort(int[] arr, int left, int right, int[] tmp) {
        if (left < right) { // 如果左索引小于右索引,说明当前区间内有多个元素,需要排序
            int mid = (left + right) / 2; // 计算中间索引,将当前区间分为两半

            // 对左边序列进行归并排序
            mergeSort(arr, left, mid, tmp);
            // 对右边序列进行归并排序
            mergeSort(arr, mid + 1, right, tmp);

            // 合并两个有序序列
            merge(arr, left, mid, right, tmp);
        }
    }

    // 归并方法,用于合并两个有序序列
    private static void merge(int[] arr, int left, int mid, int right, int[] temp) {
        int tempBeginIndex = 0; // 临时数组的起始索引
        int i = left; // 左边序列的起始索引
        int j = mid + 1; // 右边序列的起始索引

        // 合并两个有序序列到临时数组temp中
        while (i <= mid && j <= right) { // 当左右序列都还有元素时
            if (arr[i] <= arr[j]) { // 如果左边序列的元素小于等于右边序列的元素
                temp[tempBeginIndex++] = arr[i++]; // 将左边序列的元素加入临时数组,并移动索引
            } else {
                temp[tempBeginIndex++] = arr[j++]; // 将右边序列的元素加入临时数组,并移动索引
            }
        }

        // 拷贝左边序列剩余的元素到temp
        while (i <= mid) {
            temp[tempBeginIndex++] = arr[i++];
        }

        // 拷贝右边序列剩余的元素到temp
        while (j <= right) {
            temp[tempBeginIndex++] = arr[j++];
        }

        // 将temp中的元素拷贝回原数组arr,完成合并
        for (int k = 0; k < tempBeginIndex; k++) {
            arr[left + k] = temp[k];
        }
    }
}

四  总结

  1.  归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
  2.  时间复杂度:O(N*logN)
  3.  空间复杂度:O(N)
  4.  稳定性:稳定

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

编译器优化乌龙——记一次死循环不进入问题

记一次死循环不生效问题 看如下代码&#xff0c;本意是我们模拟一次死循环&#xff0c;然后会在中断处理函数中更改waiting的值&#xff0c;更改waiting的值后&#xff0c;跳出死循环。 int waiting 0; while(waiting0){}运行起来发现&#xff0c;程序根本就没有进入这个死循…

构建第一个ArkTs应用

1、新建第一个页面文件。在“Project”窗口&#xff0c;点击“entry > src > main > ets > pages”&#xff0c;打开“Index.ets”文件&#xff0c;进行页面的编写。 2、新建第二个页面文件。在“Project”窗口&#xff0c;打开“entry > src > main > e…

一文搞懂Linux kernel编译步骤

一、前言 什么是Linux的内核编译呢&#xff1f;简单来说&#xff0c;Linux内核编译是一个将内核源代码转换成可在特定的硬件架构上运行的二进制文件的过程。通过编译内核&#xff0c;我们可以根据自己的需求和兴趣对内核进行定制和优化&#xff0c;以满足特定的应用场景。下文…

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

消息通知——公众号、小程序、短信对比

消息通知——公众号、小程序、短信对比 引言 在数字化时代&#xff0c;高效、准确的消息通知对于提升用户体验、增强用户粘性至关重要。本报告将深入分析三种常见的消息通知方式&#xff1a;微信公众号推送、微信小程序推送以及手机短信推送&#xff0c;从实现方式、优缺点及细…

三维测量与建模笔记 - 3.2 直接线性变换法标定DLT

DLT - Direct Linear Transform 上图中&#xff0c;透视成像对应的公式是共线方程&#xff0c;可以参考以下链接&#xff1a; https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说&#xff0c;需要找到。已知量是。 (u,v)是…

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么&#xff1f;说说你们项目里是怎么用消息队列的&#xff1f; 我们有一个订单系统&#xff0c;订单系统会每次下一个新订单的时候&#xff0c;就会发送一条消息到ActiveMQ里面去&#xff0c;后台有一个库存系统&#xff0c;负责获取…

【论文复现】KAN卷积:医学图像分割新前沿

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀知识图谱推理 1. 概述2. 核心创新点3. 模块介绍KANUNext模块 4. 本文主要结构5. 主要代码6. 数据集7. 结果展示8. 参考文献 前言&#xff1a;…

Oracle与SQL Server的语法区别

1&#xff09;日期和日期转换函数。 SQL: SELECT A.*, CASE WHEN NVL(PAA009,) OR PAA009 >Convert(Varchar(10), SYSDATE,120) THEN Y ELSE N END AS ActiveUser FROM POWPAA A WHERE PAA001admin or PAA002admin Oracle: SELECT A.*, CASE WHEN NVL(PAA009,) or PAA009&…

基于TRIZ理论的便携式光伏手机充电装置创新

随着智能手机功能的日益强大&#xff0c;电量消耗问题也日益凸显&#xff0c;尤其是在户外活动时&#xff0c;电量告急常常让人措手不及。面对这一挑战&#xff0c;基于TRIZ&#xff08;发明问题解决理论&#xff09;的创新思维&#xff0c;一款全新的便携式光伏手机充电装置应…

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

NPU 可不可以代替 GPU

结论 先说结论&#xff0c;GPU分为可以做图形处理的传统意义上的真GPU&#xff0c;做HPC计算的GPGPU和做AI加速计算的GPGPU&#xff0c;所以下面分别说&#xff1a; 对于做图形处理的GPU&#xff0c;这个就和NPU 一样&#xff0c;属于DSA&#xff0c;没有替代性。当然&#xf…

python画图|hist()函数画直方图进阶

【1】引言 前序已经学习了hist()函数画直方图的基础教程&#xff0c;相关文章见下述链接&#xff1a; python画图|hist()函数画直方图初探-CSDN博客 在这里我们初步认识了hist()函数&#xff0c;并使用该函数画出了8个直方图。 之后又用bar(&#xff09;函数进行对比&#…

推荐一款非常好用的C/C++在线编译器

C/C作为一门底层、高效的编程语言&#xff0c;广泛应用于系统开发、游戏引擎、嵌入式系统等领域。然而&#xff0c;C/C的开发环境配置会让开发者把部分时间消耗在这件事上&#xff0c;也经常会遇到各种各样的环境问题。 本地开发的痛点 环境配置复杂&#xff1a;C/C的开发环境…

kafka如何获取 topic 主题的列表?

大家好&#xff0c;我是锋哥。今天分享关于【kafka如何获取 topic 主题的列表&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka如何获取 topic 主题的列表&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;可以…

用示例来看C2Rust工具的使用和功能介绍

C2Rust可以将C语言的源代码转换成Rust语言的源代码。下面是一个简单的C语言代码示例&#xff0c;以及使用c2Rust工具将其转换为Rust安全代码的过程。 C语言源代码示例 // example.c #include <stdio.h>int add(int a, int b) {return a b; }int main() {int result a…

数据结构排序之直接选择排序--堆排序

堆排序 堆排序 (Heapsort) 是指利用堆积树&#xff08;堆&#xff09;这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆&#xff0c;排降序建小堆。 直接选择排序的特性总结&#xff1a; 1. 堆排序使…

使用DJL和PaddlePaddle的口罩检测详细指南

使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型&#xff0c;构建了一个口罩检测应用程序。该应用能够在图片中检测人脸&#xff0c;并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分&#xff0c;以便…