归并排序的非递归实现

归并排序的核心思想是分治,也就是将原数组切分成两个子数组分配排序再将排好序的两个子数组进行合并,之前的文章已经讲过递归版本的实现,现在我们看看非递归版本的实现

第一种思路:用步长来切分数组,也就是我们在切分数组的时候,每个子数组里面的数据个数要等于步长,假设给定数组:[3,2,5,4],我们初始给定一个步长step=1,那么第一轮切分出来的子数组分别是[3],[2]合并得到[2,3],[5],[4]合并得到[4,5],这样第一轮步长等于1就完成了,第二轮步长等与原步长乘以2,也就是每一轮都将原步长乘以2,这样得到的子数组分别是[2,3]和[4,5],进行合并,依次类推

    private void mergeSort(int arr[]) {int n = arr.length;int step = 1;while (step < n) {//步长不能超过数组最大下标int l = 0;//左子数组的第一个位置while (l < n) {int m = l + step - 1;//左子数组的最后一个位置if (m >= n) {//左子数组都凑不够,就不存在合并的问题,直接扩大步长break;}int r = m + step;//右子数组的右边界r = Math.min(r, n - 1);//右子数组的右边界不能超过数组最大值merge(arr, l, m, r);//合并两个子数组l = r + 1;//下一对数组继续}if (step > (n >> 1)) {//防止超过int类型最大值溢出break;}step = step << 1;}}
    private void merge(int[] arr, int start, int middle, int end) {int i = 0;int[] help = new int[end - start + 1];int index1 = start;int index2 = middle + 1;while (index1 <= middle && index2 <= end) {help[i++] = arr[index1] <= arr[index2] ? arr[index1++] : arr[index2++];}while (index1 <= middle) {help[i++] = arr[index1++];}while (index2 <= end) {help[i++] = arr[index2++];}int length = help.length;for (int i1 = 0; i1 < length; i1++) {arr[start + i1] = help[i1];}}

第二种思路:我们知道归并排序的递归版本其本质上是jvm层面,在栈里面不停地创建方法栈帧,而刚好jdk里面给我们提供了一个栈的实现,也就是stack(其实这里不一定要用stack,队列也可以),原理也是类似的,我们初始的时候把每一个数组元素转换成数组放到栈里面,然后每次从栈中取出两个元素(此时取出来的是数组)进行合并,然后把合并的结果继续入栈,只要栈里面的元素个数大于1,这个过程就持续下去,这样到最后,栈里面只剩一个元素的时候,就是最终归并排序的结果:

 public void mergeSort(int[] arr) {if (arr == null || arr.length < 2) return; // 如果数组为空或只有一个元素,直接返回Queue<int[]> queue = new LinkedList<>(); // 使用队列存储子数组for (int i = 0; i < arr.length; i++) { // 将每个元素作为一个独立的子数组加入队列queue.add(new int[]{arr[i]});}while (queue.size() > 1) { // 当队列中还剩下两个以上的子数组时,继续合并int[] left = queue.poll(); // 取出第一个子数组int[] right = queue.poll(); // 取出第二个子数组int[] merged = merge(left, right); // 合并这两个子数组queue.add(merged); // 将合并后的子数组重新加入队列}int[] sortedArray = queue.poll(); // 队列中的最后一个子数组就是最终的排序结果System.arraycopy(sortedArray, 0, arr, 0, arr.length); // 将排序结果复制回原数组}
    private int[] merge(int[] left, int[] right) {int[] merged = new int[left.length + right.length]; // 创建一个新的数组来存放合并后的结果int i = 0, j = 0, k = 0;while (i < left.length && j < right.length) {if (left[i] <= right[j]) {merged[k++] = left[i++];} else {merged[k++] = right[j++];}}// 处理剩余的元素while (i < left.length) {merged[k++] = left[i++];}while (j < right.length) {merged[k++] = right[j++];}return merged;}

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

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

相关文章

docker安装informix

docker安装informix 通过docker下载镜像 docker pull ibmcom/informix-developer-database 启动容器 docker run -it -d --name informix --privileged -p 9088:9088 -p 9089:9089 -p 27017:27017 -p 27018:27018 -p 27883:27883 -e LICENSEaccept ibmcom/informix-develope…

RestTemplate发送请求、基本spring自带RestTemplate发送请求、RestTemplate设置请求头

今天分享RestTemplate&#xff0c;直接上代码&#xff1a; 因个人需求需要重写RestTemplate&#xff0c;并设置请求头 import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.CredentialsProvide…

学习Python能给我们带来什么?有什么帮助?

文章目录 前言学习Python能做什么1、抓取各类数据、文本等信息2、批量清洗和处理数据3、提供可视化工具4、进行深度学习 Python的用途有哪些普通人学习python有什么好处关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python…

要求CHATGPT高质量回答的艺术:提示工程技术的完整指南—第 4 章:控制温度和 Top-p 采样

要求CHATGPT高质量回答的艺术&#xff1a;提示工程技术的完整指南—第 4 章&#xff1a;控制温度和 Top-p 采样 控制温度和 Top-p 采样是用于管理人工智能语言模型在生成文本时输出的创造性、连贯性和集中性的技术。 让我们打一个比方来简化它&#xff1a;把人工智能想象成一…

Linux挂载配置本地yum源

1.vi /etc/yum.repos.d/redhat.repo 2. [baseos] namebaseos baseurlfile:///mnt/BaseOS #enabled:默认为1 enabled1 gpgcheck0 [appstream] nameappstream baseurlfile:///mnt/AppStream enabled1 gpgcheck0 3. mount /dev/sr0 /mnt/ 4.yum clean all 5.yum makecache

神秘鸭是如何让你的手机控制你的电脑的?

神秘鸭 神秘鸭即是一个应用&#xff0c;它能让手机语音助手、智能音箱变的更为强大&#xff01;通过神秘鸭&#xff0c;您的手机语音助手、智能音箱可以用来控制电脑、智能家居、DIY的物联网设备。 支持的手机、平板品牌 Apple 华为 小米 三星 OPPO VIVO 一加 当然不代表仅支…

感兴趣书单汇总

文章目录 声明科幻小说哲学书数学 声明 本帖持续更新 科幻小说 《三体》&#xff08;已读&#xff09;《献给阿尔吉侬的花束》&#xff08;已读&#xff09; 哲学书 数学 《Principia Mathematica》&#xff08;未读&#xff09;&#xff1a;怀特海德和罗素所著&#xff…

C# Solidworks二次开发:创建坐标系方法和获取零件质心坐标方法详解

今天要讲的是如何在Solidworks创建坐标系和获取零件的质心方法详解&#xff0c;创建坐标系的API如下所示&#xff1a; 1、创建坐标系API如下所示&#xff1a;Feature swCoordSys1 swFeatMgr.InsertCoordinateSystem(false, false, false); 其中方法的输入参数有三个&#xf…

1466. 重新规划路线 --力扣 --JAVA

题目 n 座城市&#xff0c;从 0 到 n-1 编号&#xff0c;其间共有 n-1 条路线。因此&#xff0c;要想在两座不同城市之间旅行只有唯一一条路线可供选择&#xff08;路线网形成一颗树&#xff09;。去年&#xff0c;交通运输部决定重新规划路线&#xff0c;以改变交通拥堵的状况…

SpringBoot 知识梳理

学习目标 掌握基于 SpringBoot 框架的程序开发步骤熟练使用基于 SpringBoot 配置信息修改服务器配置基于 SpringBoot 的完成 SSM 整合项目开发 1 SpringBoot 简介 1.1 入门案例 1.1.1 步骤 ① &#xff1a;创建新模块&#xff0c;选择 Spring 初始化&#xff0c;并配置模块…

Doris 编译报错 Error: flex version (2.5.37) must be greater than or equal to 2.6.0

Doris 编译过程报错 Error: flex version (2.5.37) must be greater than or equal to 2.6.0yum update flex 不生效 下载flex 安装包 https://github.com/westes/flex/releases解压 tar -xvf flex-2.6.4.tar

万宾科技智能水环境综合治理监测系统效果

水环境综合治理是一项旨在全面改善水环境质量的系统工程。它以水体为对象&#xff0c;综合考虑各种因素&#xff0c;通过科学规划和技术手段&#xff0c;解决水环境污染、生态退化等问题&#xff0c;核心理念是“统一规划、分步实施&#xff1b;标本兼治&#xff0c;重在治本&a…

习题练习讲解

前言&#xff1a;这又是一个新坑&#xff0c;算上之前的4个坑这是第五个坑&#xff08;1、C/C的讲解&#xff0c;2、C语言小游戏&#xff0c;3、大学生活&#xff0c;4、假哲家因为某些原因没GS&#xff09;&#xff0c;这个就是发一些自己在刷题的过程中遇到自己感觉还不错的习…

Mendix版的电商京东首页长什么样儿?

前言 世界需要大前端。大前端需要Mendix。 近日经常有企业IT侧的朋友反应&#xff0c;自家需要一个神奇的内容管理平台&#xff0c;来快速打造随需应变的公司官网&#xff0c;亦或企业官微&#xff0c;如果能在小程序里呈现产品营销类的功能更好。首先要肯定的是&#xff0c;…

Linux设置Docker自动创建Nginx容器脚本

文章目录 前言一、本地新建脚本二、复制本地脚本到服务器三、执行服务器脚本总结如有启发&#xff0c;可点赞收藏哟~ 前言 一、本地新建脚本 在本地新建nginx-generator.sh脚本文件&#xff0c;并保存以下内容 主要动态定义两个变量&#xff08;容器名称/服务器本地文件名、端…

Spring Cache【娓娓道来】

目录​​​​​​​ 1.自我介好&#x1f633;&#x1f633;&#x1f633; 2.常用注解 &#x1f495;&#x1f495;&#x1f495; 3.EnableCaching&#x1f926;‍♂️&#x1f926;‍♂️&#x1f926;‍♂️ 4.CachePut&#x1f937;‍♀️&#x1f937;‍♀️&#x1f93…

php第三方skd自动加载

把mugou-sdk复制到项目下在composer.josn找到classmap加入sdk "autoload": {"classmap": ["mugou-sdk"] },在composer.josn找到files加入sdk "autoload": {"files":[mugou-sdk] },项目目录下运行 composer dump-autoload…

Python 从入门到精通 学习笔记 Day01

Python 从入门到精通 第一天 今日目标 计算机组成原理、编程语言、Python环境安装 第一个Python程序、PyCharm的安装与使用 Python的基础语法、Python的基本数据类型 一、计算机组成原理 计算机的组成 计算机硬件通常由以下几个部分组成: 1.中央处理器(CPU):负责执行计算机…

高防CDN:企业网络安全的坚实屏障

在当今数字化时代&#xff0c;企业网络面临着不断增长的网络威胁和攻击。为了维护企业在线业务的正常运行&#xff0c;高防CDN&#xff08;Content Delivery Network&#xff09;作为网络安全的坚实屏障&#xff0c;扮演着至关重要的角色。本文将从一家企业公司的角度出发&…

windows建立软链 报 无法将“mklink”项识别为 cmdlet、函数、脚本文件或可运行程序的名称

当我执行网上提供的mklink 的时候&#xff0c;出现 mklink : 无法将“mklink”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。怎么回事&#xff0c;原来&#xff0c;要在执行的签名加 cmd /c 当我执行建立软链接时&#xff0c;提示 没有足够的权限&#xff0c;要用管理…