归并排序(Java)

        归并排序是常见的八大排序算法之一,归并排序也是一种时间复杂度比较好的一种算法,为0(n*logn)级别。

        归并排序可以用递归和非递归两种方式来实现,当然,递归方法是比较简单的,而非递归则是相对而言比较难的一种思路。

        归并排序的总体思路就是将一个大的无序数组,划分为多个内部有序的数组,而组间可能是无序的,通过合并相邻两组得到一个新的有序数组来实现,最终合并成总体的大数组,即完成排序。

        因此,对于归并排序,我们需要先向下分组,然后再将各个数组合并,得到一个新的数组,直到最后合并成一个数组,算法结束。

        具体细节,则是通过将大数组划分,首先划分为每一组单个元素,单个元素的数组可以认为是有序的。如何依次从左向右,每次取两个相邻数组,进行合并,即两个有序数组的合并,合并完以后,再找下一组两个相邻的数组进行合并(并不包括上次合并好的数组),直到最后只有一个组或者没有组了,就重新从头开始合并,继续上述步骤。

        对于递归写法,我们可以认为数组中的各个元素都是二叉树的叶子结点,依据上述思路,两两合并成一个结点,最后合并成一个结点,即排序结束。

        对于非递归写法,我们可以设置一个变量来存储要比较的数组长度,从一开始,到数组长度结束,即使分开后的数组元素个数并不等于这个变量,只要有和他配对的就可以合并。

        代码测试通过力扣中的题目进行测验。

代码实现:

递归:

class Solution {
    public int[] sortArray(int[] nums) {
        mergeSort(nums,0,nums.length-1);
        return nums;
    }
    public void mergeSort(int[] nums,int left,int right){
        if(right==left){
            return;
        }
        int center=(left+right)/2;
        mergeSort(nums,left,center);
        mergeSort(nums,center+1,right);
        merge(nums,left,center,right);
    }
    public void merge(int[] nums,int left,int center,int right){
        int i=left;
        int j=center+1;
        int[] temp=new int[right-left+1];
        int count=0;
        while(i<=center && j<=right){
            temp[count++]=nums[i]>nums[j]?nums[j++]:nums[i++];
        }
        while(i<=center){
            temp[count++]=nums[i++];
        }
        while(j<=right){
            temp[count++]=nums[j++];
        }
        for(int k=0;k<temp.length;k++){
            nums[left+k]=temp[k];
        }
    }
}

        力扣提交结果:

非递归:

class Solution {
    public int[] sortArray(int[] nums) {
        for(int l,m,r,step=1;step<nums.length;step*=2){
            l=0;//设置初始值
            while(l<nums.length){//有左边的组
                m=l+step-1;
                if(m+1>=nums.length){//如果没有右边的组,就退出
                    break;
                }
                r=Math.min(l+(step*2)-1,nums.length-1);//获取右边界,取两者的最小值
                merge(nums,l,m,r);//将两个组合并
                l=r+1;//找到下一个左边的组
            }
        }
        return nums;
    }
    public void merge(int[] nums,int left,int center,int right){
        int i=left;
        int j=center+1;
        int[] temp=new int[right-left+1];
        int count=0;
        while(i<=center && j<=right){
            temp[count++]=nums[i]>nums[j]?nums[j++]:nums[i++];
        }
        while(i<=center){
            temp[count++]=nums[i++];
        }
        while(j<=right){
            temp[count++]=nums[j++];
        }
        for(int k=0;k<temp.length;k++){
            nums[left+k]=temp[k];
        }
    }
}

力扣提交结果:

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

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

相关文章

使用 NtQuerySystemInformation 遍历进程信息

在 Windows 操作系统中&#xff0c;了解正在运行的进程的信息对于系统管理和性能优化至关重要。通过遍历系统进程信息&#xff0c;我们可以获取进程的 ID、名称、线程数、句柄数以及各种性能指标&#xff0c;从而帮助我们了解系统的运行状况并进行必要的调整和优化。本文将详细…

python coding with ChatGPT 打卡第17天| 二叉树:找树左下角的值、路径总和

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…

Quicker读取浏览器的书签(包括firefox火狐)

从edge换了火狐&#xff0c;但是quicker不能读取本地的bookmarks文件了&#xff0c;就研究了一下。 方法1&#xff1a;读取本地Bookmarks文件&#xff08;仅谷歌内核浏览器&#xff09; 谷歌内核的浏览器本地会有Bookmarks文件&#xff0c;放了所有的书签数据&#xff0c;直接…

新版MQL语言程序设计:键盘快捷键交易的设计与实现

文章目录 一、什么是快捷键交易二、使用快捷键交易的好处三、键盘快捷键交易程序设计思路四、键盘快捷键交易程序具体实现1.界面设计2.键盘交易事件机制的代码实现 一、什么是快捷键交易 操盘中按快捷键交易是指在股票或期货交易中&#xff0c;通过使用快捷键来进行交易操作的…

故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,TCN时间卷积神经网络模型的故障诊断(Matlab) 模型描述 时间卷积神经网络(TCN)是一种用于序列数据建模和预测的深度学习模型。它通过卷积操作在时间维度上对序列数据进行特征提取,并且可以处理可变长度的输入序列。 要使用TCN进行…

昆仑万维发布天工 2.0 大语言模型及AI助手App;AI成功破解2000年前碳化古卷轴

&#x1f989; AI新闻 &#x1f680; 昆仑万维发布天工 2.0 大语言模型及AI助手App 摘要&#xff1a;昆仑万维近日推出了新版MoE大语言模型“天工 2.0”和相应的“天工 AI 智能助手”App&#xff0c;宣称为国内首个面向C端用户免费的基于MoE架构的千亿级参数大模型应用。天工…

购物车底部工具栏全选、总价、总数量实现

购物车商品加一个checked属性 定义allChecked属性 <!-- 底部工具栏 开始 --> <view class"footer_tool"><!-- 全选 开始 --><view class"all_chk_wrap"><checkbox-group><checkbox checked"{{allChecked}}">…

视频上传 - 断点续传那点事

在上一篇文章中&#xff0c;我们讲解了分片上传的实现方式。在讲解断点续传之前&#xff0c;我要把上篇文章中留下的问题讲解一下。读过上一篇文章的小伙伴们都知道&#xff0c;对于分片上传来说&#xff0c;它的传输方式分为2种&#xff0c;一种是按顺序传输&#xff0c;一种是…

如何安装x11vnc并结合cpolar实现win远程桌面Deepin

文章目录 1. 安装x11vnc2. 本地远程连接测试3. Deepin安装Cpolar4. 配置公网远程地址5. 公网远程连接Deepin桌面6. 固定连接公网地址7. 固定公网地址连接测试 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff…

机器学习系列——(十六)回归模型的评估

引言 在机器学习领域&#xff0c;回归模型是一种预测连续数值输出的重要工具。无论是预测房价、股票价格还是天气温度&#xff0c;回归模型都扮演着不可或缺的角色。然而&#xff0c;构建模型只是第一步&#xff0c;评估模型的性能是确保模型准确性和泛化能力的关键环节。本文…

微信小程序解决华为手机保存图片到相册失败

1.新增隐私设置 2.优化代码 新增uni.authorize判断 _saveCode() {let that this;console.log(点击了保存图片)console.log(this.result)uni.authorize({scope: scope.writePhotosAlbum,success(e) {console.log(e)if (this.result ! "") {uni.saveImageToPhotosAlb…

github使用问题汇总

1. Permission denied 1.1. 问题描述 Permission denied (publickey). fatal: Could not read from remote repository. 1.2. 解决方法 生成公钥 ssh-keygen -t ed25519 -C "your_emailexample.com" 点击回车三次 Generating public/private ed25519 key pair. …

使用Nginx搭建旁路服务器获取客户端真实IP

一、前言 在实际业务开发过程中&#xff0c;很多时候有记录客户端真实IP的需求&#xff0c;但是从客户端发送的请求往往会经过很多代理服务器&#xff0c;导致后端服务获取的IP为代理以后的IP&#xff0c;不具有业务含义。为了解决这个问题&#xff0c;可以搭建一个旁路服务器…

上海亚商投顾:沪指涨超3% 深成指和创指双双飙涨超6%

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 今日A股三大指数一改近期低迷状态&#xff0c;早盘小幅低开后一路高歌猛进集体大涨&#xff0c;沪指涨超3%&am…

YUM | 包安装 | 管理

YUM 功能 软件包安装&#xff1a; 通过yum命令安装软件包。例如&#xff0c;安装一个名为 example-package 的软件包 yum install example-package更新包 检查更新&#xff1a; 检查可用更新&#xff1a; sudo yum check-update <package_name>软件包更新&#xff1a; y…

dolphinscheduler海豚调度(一)简介快速体验

1、简介 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系&#xff0c;并为应…

AI助力农作物自动采摘,基于DETR(DEtection TRansformer)开发构建作物生产场景下番茄采摘检测计数分析系统

去年十一那会无意间刷到一个视频展示的就是德国机械收割机非常高效自动化地24小时不间断地在超广阔的土地上采摘各种作物&#xff0c;专家设计出来了很多用于采摘不同农作物的大型机械&#xff0c;看着非常震撼&#xff0c;但是我们国内农业的发展还是相对比较滞后的&#xff0…

计算机视觉 | OpenCV 实现手势虚拟控制亮度和音量

Hi&#xff0c;大家好&#xff0c;我是半亩花海。在当今科技飞速发展的时代&#xff0c;我们身边充斥着各种智能设备&#xff0c;然而&#xff0c;如何更便捷地与这些设备进行交互却是一个不断被探索的课题。本文将主要介绍一个基于 OpenCV 的手势识别项目&#xff0c;通过手势…

基于Java学生管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

解锁阿里巴巴面试题:创建线程的几种方式?

大家好,我是小米!今天我们来聊一个热门话题——阿里巴巴面试题:创建线程的几种方式。在技术的海洋中,线程是我们编程航程中的一艘不可或缺的船,驶向程序的未知领域。那么,究竟有哪些方式可以创建线程呢?让我们一起揭开这个技术的神秘面纱! 实现Runnable接口 首先,我…