归并算法实现

news2024/11/15 11:16:10

1.归并算法图解

在这里插入图片描述

2.归并算法代码

package com.suanfa.sort;

import java.util.Arrays;

/**
 * 归并算法
 */
public class MergeSort {

    /**
     * 拆的时间复杂度logn * 并的时间复杂度n = nlogn
     *
     * @param arr
     * @param left
     * @param right
     */
    public static void sortMerge(int[] arr, int left, int right) {
        //相等了就表示只有一个数了 不用再拆了
        if (left < right) {
            //取中间值进行拆分
            int mid = (left + right) / 2;
            //左边拆分(从右往左拆分),拆的过程的时间复杂度是logn(从右往左拆分)
            sortMerge(arr, left, mid);
            //右边拆分(从左往右拆分)
            sortMerge(arr, mid + 1, right);
            //这里合并值是从右边开始合并(因为这里是栈先执行后返回后执行的先返回),等栈回溯到最后一次时就相当于拆成两个一起合并了
            merge(arr, left, mid, right);
            System.out.println(Arrays.toString(arr));
        }
    }

    /**
     * 并的时间复杂度为n
     *
     * @param arr
     * @param left
     * @param mid
     * @param right
     */
    public static void merge(int[] arr, int left, int mid, int right) {
        //临时数组,用来存放合并的有序数据
        int[] temp = new int[arr.length];
        //分割左边的开始位置
        int point1 = left;
        //分割右边开始位置
        int point2 = mid + 1;
        //这里为什么是left,因为这里排序是从左边到右边结束,所以开始值是left
        int tempIndex = left;
        //将左边和右边合并,使用插入排序,终止条件时左边的开始位置到左边边界,右边到右边边界
        while (point1 <= mid && point2 <= right) {
            if (arr[point1] < arr[point2]) {
                temp[tempIndex] = arr[point1];
                point1++;
            } else {
                temp[tempIndex] = arr[point2];
                point2++;
            }
            tempIndex++;
        }
        //如果左边的位置小于或者等于左边的边界值,说明左边的值还有数据没有放入到临时数组中
        // 这里一般会有一个数据还没有放进去,因为最后一个数据是没有数据可比较了
        while (point1 <= mid) {
            temp[tempIndex] = arr[point1];
            point1++;
            tempIndex++;
        }
        //这里是放入右边还没有放入的数据
        while (point2 <= right) {
            temp[tempIndex] = arr[point2];
            point2++;
            tempIndex++;
        }
        //总结:这里左边和右边只可能有一边需要放入,因为最后剩一个数据要么是左边的要么是右边的

        //这里为什么是left开始right结束,以为排序是从left开始right结束的
        for (int i = left; i <= right; i++) {
            arr[i] = temp[i];
        }
    }

    public static void main(String[] args) {
        int arr[] = {9, 5, 6, 8, 0, 3, 7, 1};
        sortMerge(arr, 0, arr.length - 1);
    }
}

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

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

相关文章

第十一章 从0-1搭建一个简单的JavaWeb系统(三)

目录 一、工程代码结构 二、代码实现 三、运行效果 四、未完待续 本章节的每一段代码&#xff0c;建议全部自己敲一遍&#xff0c;加深印象&#xff0c;切勿直接复制黏贴。 一、工程代码结构 本章节实现注销&#xff08;退出&#xff09;功能&#xff0c;以下图片中标红的…

19个邮件群发小技巧,最大水平充分利用邮件营销

邮件群发在现代通信中占据着非常重要的位置。无论是在商业环境还是个人生活中&#xff0c;它都有着广泛的应用。无论您是公司的市场推广专家&#xff0c;还是社交团体的筹办者&#xff0c;掌握有效的邮件群发技巧会帮助您更好地传递信息、节约时间和提升工作效率。 确定目标受众…

【Ubuntu】Ubuntu安装编译C/C++环境简易版教程

环境 操作系统&#xff1a;ubuntu-22.04.4-desktop-amd64.iso 安装 第一步:更新软件包列表&#xff0c;检查可用的软件包更新 sudo apt update在这一步&#xff0c;我们可以确保系统中的软件包列表是最新的&#xff0c;以便后续的软件包管理操作。 第二步&#xff1a;安装…

craco-less使用问题

craco-less使用问题 问题背景 前端是用React搭建&#xff0c;使用craco配置&#xff0c;相关库或插件版本如下 "craco/craco": "^7.1.0","react-scripts": "^5.0.1","craco-less": "^3.0.1"在生产环境&#xff…

JAVA开源项目 甘肃非物质文化网站 计算机毕业设计

本文项目编号 T 043 &#xff0c;文末自助获取源码 \color{red}{T043&#xff0c;文末自助获取源码} T043&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【无人机设计与控制】基于蜣螂优化算法求解多无人机集群路径规划问题

摘要 本文基于蜣螂优化算法&#xff08;Dung Beetle Optimization, DBO&#xff09;研究了多无人机路径规划问题。目标是优化多无人机的飞行轨迹&#xff0c;在避免障碍物的同时&#xff0c;尽量减少能量消耗并保持集群内的通信。为提高搜索效率和准确性&#xff0c;对DBO进行…

AJAX 入门 day3 XMLHttpRequest、Promise对象、自己封装简单版的axios

目录 1.XMLHttpRequest 1.1 XMLHttpRequest认识 1.2 用ajax发送请求 1.3 案例 1.4 XMLHttpRequest - 查询参数 1.5 XMLHttpRequest - 数据提交 2.Promise 2.1 Promise认识 2.2 Promise - 三种状态 2.3 案例 3.封装简易版 axios 3.1 封装_简易axios_获取省份列表 3…

Spring Boot 中实现任务后台处理的几种常见方式

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 在现代应用程序中&#xff0c;后台处理对于处理发送电子邮件、处理文件、生成报告等任务至关重要。 Spring Boot 提供了多种机制来高效地实现后台任务。本文探讨了在 Spring Boot 中处理后台处理的各…

STM32调试TIC12400笔记

工作中需要用到&#xff0c;但是有关这个芯片的参考资料好少&#xff0c;自己写一下调试过程&#xff0c;持续更新中&#xff0c;还没调完。 用的是正点原子的mini板&#xff0c;芯片是stm32f103RCT&#xff0c;需要知道spi的相关知识&#xff0c;先配置spi&#xff0c;用cube…

Ubuntu初期配置常见问题汇总

ubuntu配置vim 代码配色 终端配置 ubuntu配置vim 代码配色 终端配置_ubuntu的vim配置-CSDN博客https://blog.csdn.net/GM2418/article/details/134195020小缺点是无法自动补齐 ubuntu中vim实现代码补全等功能_ubuntu vim 自动补全-CSDN博客https://blog.csdn.net/weixin_4580…

图纸加密软件有哪些?2024好用不踩雷的10款图纸加密软件推荐!

在当今数字化时代&#xff0c;图纸作为工程设计、建筑规划等领域的重要文件&#xff0c;其安全性至关重要。为了保护这些敏感信息不被泄露&#xff0c;图纸加密软件应运而生。本文将为您推荐2024年10款好用且不踩雷的图纸加密软件&#xff0c;帮助您选择最适合的工具来保护您的…

【machine learning-十-grading descent梯度下降实现】

grading descent 梯度下降参数更新方法 --导数和学习率 从导数项直观理解梯度下降 grading descent 算法就是更新参数&#xff0c;今天来学习下如何更新w和b 梯度下降 还是以线性回归的均方差损失函数如下为例&#xff1a; 损失函数的可视化图如下 &#xff1a; 横轴和纵轴分…

平价头戴式蓝牙耳机哪个牌子好?四大平价爆款头戴式耳机品牌推荐

在追求高品质音乐生活的同时&#xff0c;我们往往被高昂的价格所困扰&#xff0c;然而随着科技的进步和市场竞争的加剧&#xff0c;越来越多的平价头戴式蓝牙耳机品牌开始崭露头角&#xff0c;它们以出色的音质、舒适的佩戴体验和亲民的价格赢得了广大消费者的喜爱&#xff0c;…

数据结构之线性表(python)

华子目录 线性表的定义前驱与后继 1.顺序表&#xff08;顺序存储结构&#xff09;python列表与数组的区别列表数组 1.1插入数据实例 1.2删除元素实例 1.3查找元素1.4修改元素1.5综合示例 2.单链表2.1单链表的初始化2.2插入元素示例注意 2.3删除元素示例 2.4修改元素2.5查找元素…

【网络】TCP协议的简单使用

目录 echo_service server 单进程单线程 多进程 多线程 线程池 client echo_service_code echo_service 还是跟之前UDP一样&#xff0c;我们先通过实际的代码来实现一些小功能&#xff0c;简单的来使用TCP协议进行简单的通信&#xff0c;话不多说&#xff0c;我们先实现…

LabVIEW提高开发效率技巧----合理使用数据流与内存管理

理使用数据流和内存管理是LabVIEW开发中提高性能和稳定性的关键&#xff0c;特别是在处理大数据或高频率信号时&#xff0c;优化可以避免内存消耗过大、程序卡顿甚至崩溃。 1. 使用 Shift Register 进行内存管理 Shift Register&#xff08;移位寄存器&#xff09; 是 LabVIE…

五分钟上手Spring AI Alibaba,轻松打造智能聊天应用

文章目录 快速上手快速体验示例示例开发指南总结 快速上手 Spring AI Alibaba 已经完全适配了阿里云通用模型&#xff0c;接下来&#xff0c;我们将学习如何使用 spring ai alibaba 开发一个基于通用模型服务的智能聊天应用。 快速体验示例 下载项目 运行以下命令下载源码&…

【产品更新】中汇保函-电子保函管理平台

中汇保函 新增 1.手机扫描保函验真二维码直接跳转小程序模块&#xff0c;验真快人一步。 2.新增客户服务服务&#xff0c;可直接联系微信客服。 优化 1.提交申请、登录程序响应速度。 更新内容说明 1.手机扫描保函验真二维码直接跳转小程序模块&#xff0c;验真快人一步。 2.…

从零开始之AI面试小程序

从零开始之AI面试小程序 文章目录 从零开始之AI面试小程序前言一、工具列表二、部署流程1. VMWare安装2. Centos安装3. Centos环境配置3.1. 更改子网IP3.2. 配置静态IP地址 4. Docker和Docker Compose安装5. Docker镜像加速源配置6. 部署中间件6.1. MySQL部署6.2. Redis部署 7.…

华为OD机试 - 出租车计费(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…