归并排序的递归和非递归实现

news/2024/5/8 21:56:26/文章来源:https://blog.csdn.net/hey_lie/article/details/132717534

归并排序 平均时间复杂度O(n*logn),空间复杂度O(n)

递归实现

思路:

分治法

即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。归并排序是一种稳定的排序方法

code:
    //递归版public static void mergetSort1(int [] arr){//边界判断if(arr == null ||arr.length < 2)return;progress(arr,0,arr.length-1);}//递归将arr[L,R]内数据排序//O(N*logN)public static void progress(int [] arr,int L,int R){if(L == R){return;}//一次性申请辅助空间int [] help = new int[arr.length];//中间位置int mid = L + ((R - L) >> 1);//将左侧排序progress(arr,L,mid);//将右侧排序progress(arr,mid+1,R);//将左右侧合并排序merge(arr,L,mid,R,help);}//合并排序arr[L,mid]和arr[mid+1,R]//申请一个辅助数组,长度位L和R的之间长度,用于保存排序后的结果//p1为左侧开始位,p2为右侧开始位//对比排序后,将剩余数记录到help中public static void merge(int [] arr,int L,int mid,int R,int [] help){int i = 0;//对比开始位置int p1 = L,p2 = mid+1;//对比限制while (p1 <= mid && p2 <= R){//如果arr[p1] <= arr[p2]则将arr[p1]放入help中 ,然后p1++ ,i++//否则 将arr[p2]放入help中,然后 p2++,i++help[i++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];}//将剩余数放入help中while (p1<=mid){help[i++] = arr[p1++];}while (p2<=R){help[i++] = arr[p2++];}//将help中数放到arr中for(i=0;i<R-L+1;i++){arr[L+i] = help[i];}}

非递归实现

思路:

通过步长从1->2->4->8...拆分数组,每一次合并排序有序子数组

code:
    //非递归 归并排序//步长从 1 ->2 ->4 ->8//分别对步长内左右进行排序public static void mergeSort2(int [] arr){if(arr == null || arr.length <2)return;//步长int step = 1;int N = arr.length;int L = 0;//左组第一个位置//一次性申请辅助空间int [] help = new int[arr.length];while (step < N){L = 0;//每次第一个位置应该都是0//L位置不能超过数组长度while (L < N){//分组后左组最后一个数位置int M = L + step -1;//左组最后一个位置超过数组长度if(M >= N){break;}//如果分组最后一组只满足左组,右组没有值时,该小组不用排序// N -L 最后一组的左组,步长 >=,说明只有左组,没有右组,不进行排序if(step >= N-L){break;}//计算右组最后一个位置,右组开始位置位 M+1int R = Math.min(M+step,N-1);//合并左右组merge(arr,L,M,R,help);//合并后进行下一小组L = R + 1;}//防止溢出,如果N很接近整数最大值,当step来到接近N时,乘2就溢出了if(step > N/2){break;}//步长翻倍//左移一位等价于 *2step <<=1;}}//合并排序arr[L,mid]和arr[mid+1,R]//申请一个辅助数组,长度位L和R的之间长度,用于保存排序后的结果//p1为左侧开始位,p2为右侧开始位//对比排序后,将剩余数记录到help中public static void merge(int [] arr,int L,int mid,int R,int [] help){int i = 0;//对比开始位置int p1 = L,p2 = mid+1;//对比限制while (p1 <= mid && p2 <= R){//如果arr[p1] <= arr[p2]则将arr[p1]放入help中 ,然后p1++ ,i++//否则 将arr[p2]放入help中,然后 p2++,i++help[i++] = arr[p1]<=arr[p2]?arr[p1++]:arr[p2++];}//将剩余数放入help中while (p1<=mid){help[i++] = arr[p1++];}while (p2<=R){help[i++] = arr[p2++];}//将help中数放到arr中for(i=0;i<R-L+1;i++){arr[L+i] = help[i];}}

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

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

相关文章

【深度学习】 Python 和 NumPy 系列教程(四):Python容器:2、元组tuple详解(初始化、索引和切片、元组特性、常用操作、拆包、遍历)

目录 一、前言 二、实验环境 三、Python容器&#xff08;Containers&#xff09; 0、容器介绍 1、列表&#xff08;List&#xff09; 2、元组&#xff08;Tuple&#xff09; 1. 初始化 a. 使用小括号() b. 省略小括号 c. tuple() 函数 2. 访问元组元素 a. 索引 b.…

XXE-Lab for PHP

环境配置 1.将靶场进行下载.... https://github.com/c0ny1/xxe-lab 2.将PHPStudy的中间件与版本信息调制为php-5.4.45Apache访问以下地址开始练习... http://127.0.0.1/xxelabs/php_xxe/ 靶场实操 1.在登录界面输入账号密码并抓取数据包.... 2.尝试读取本地文件.... <…

(其他) 剑指 Offer 67. 把字符串转换成整数 ——【Leetcode每日一题】

❓ 剑指 Offer 67. 把字符串转换成整数 难度&#xff1a;中等 写一个函数 StrToInt&#xff0c;实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。 首先&#xff0c;该函数会根据需要丢弃无用的开头空格字符&#xff0c;直到寻找到第一个非空格的字符为…

博客系统(升级(Spring))(二)获取当前用户信息、对密码进行加密、设置统一数据格式、设置未登录拦截、线程池

博客系统&#xff08;二&#xff09; 博客系统获取当前用户的信息对密码进行加密和解密的操作设置统一的数据返回格式设置未登录拦截设置线程池 博客系统 博客系统是干什么的&#xff1f; CSDN就是一个典型的博客系统。而我在这里就是通过模拟实现一个博客系统&#xff0c;这是…

react实现一个搜索部门(input + tree)

目录 react实现一个搜索部门(input tree)searchDept.jsxtreeData.js使用组件效果 react实现一个搜索部门(input tree) searchDept.jsx import React, { useState, useEffect } from "react"; import StyleDeptId from "styled-components"; import Spl…

RabbitMQ管控台使用

安装成功RabbitMQ后&#xff0c;进入到管理控制台界面 拷贝配置文件到指定目录当中然后重启RabbitMQ。

力扣:92. 反转链表 II(Python3)

题目&#xff1a; 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#…

joplin更新后找不到文章

Joplin的数据默认是存储在C:\Users\Username.config\joplin-desktop下的。我修改为了D:\joplinnotes 这样就导致在升级覆盖安装的时候&#xff0c;笔记丢失路径。如果记不起之前笔记保存在哪里&#xff0c;也可以搜索类似文件来回忆之前自己保存笔记的位置 cache\ plugins\ re…

国内 Docker 镜像加速器和国内公共镜像仓库那些事

前言 首先我们知道&#xff0c;全球最大的公共镜像仓库是 Docker 公司自己搭建的 Docker Hub&#xff0c;也是权威性最高的&#xff0c;里面包含了各种各样的官方镜像&#xff0c;Docker Hub 为每一个注册用户提供了个人镜像仓库服务&#xff0c;该个人镜像仓库是公共的。 以上…

OpenCV实现图像的混合

原理 这其实也是加法&#xff0c;但是不同的是两幅图像的权重不同&#xff0c;这就会给人一种混合或者透明的感觉。 图像混合的计算公式如下: g(x)(1-a)f0(x) af1(x) 通过修改α的值(0→1) &#xff0c;可以实现非常炫酷的混合。 现在我们把两幅图混合在一起。 第一幅图…

基于SpringBoot+Vue前后端分离的学校心理健康测试系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 研究背景介绍&#xf…

华为云云服务器评测|详解 Nacos 安装部署

环境配置 服务器云耀云服务器L操作系统CentOS 7.9 64bit | 公共镜像JDK64 bit JDK 1.8MavenMaven 3.2.xnacos-server2.2.3 下载地址 官方githubRelease 2.2.3 (May 25th, 2023) alibaba/nacos GitHub百度网盘链接&#xff1a;https://pan.baidu.com/s/1K8UE6iJL2ZnosUY83b…

SpringBoot自动配置原理及使用流程

SpringBoot自动配置原理及使用流程 SpringBoot自动配置原理 具体流程 1、导入场景 以starter-web为例 场景启动器导入了相关场景的所有依赖&#xff0c;如&#xff1a;starter-json,starter-tomcat,spring-webmvc。 每个场景启动器都引入了一个spring-boot-starter,核心场景…

darknet识别(某验)文字点选验证码

今天介绍darknet识别文字点选验证码&#xff0c; Darknet is an open source neural network framework written in C and CUDA. darknet是基于yolo算法的神经网络框架。 废话少说先热热身 平台是Ubuntu20&#xff0c;首先要安装NVIDIA驱动 1、安装驱动 NVIDIA GeForce 驱动…

2023-09-09 LeetCode每日一题(课程表)

2023-09-09每日一题 一、题目编号 207. 课程表二、题目链接 点击跳转到题目位置 三、题目描述 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中…

[De1CTF 2019]SSRF Me | BUUCTF

根据题目名我们知道这是一道SSRF的题目 它允许攻击者在受害服务器上发起未经授权的网络请求 分析 在buuctf上有一个提示 也就是说flag在 网站的flag.txt 访问主页 很明显是段flask代码 格式化后 from flask import Flask, request # 导入Flask和request模块 import sock…

易优cms响应式月嫂家政服务公司网站模板源码—自适应手机端设计,支持后台管理

易优cms响应式月嫂家政服务公司网站模板源码 自适应手机端 带后台 模板基于EyouCMS内核制作,模板编码为UTF8 ,适合行业:家政服务类企业。 模板信息&#xff1a; 模板分类&#xff1a;摄像、婚庆、家政、保洁 适合行业&#xff1a;家政服务类企业 模板介绍&#xff1a; 本模…

【 Tkinter界面-练习04】 画板作画详细揭示

一、说明 对画布的掌握分三个部分&#xff0c;将图形paint到画布、动画move、鼠标画&#xff1b;本篇将侧重于鼠标画的功能&#xff0c;提起鼠标画实现&#xff0c;将涉及一系列组合操作才能完成&#xff0c;这里将一一加以介绍。 Canvas 小部件具有大量功能&#xff0c;我们不…

Redis优化 RDB AOF持久化

---------------------- Redis 高可用 ---------------------------------------- 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境…

baichuan2(百川2)本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…