归并排序 mergeSort

2023-10-30

基本概念

  • 将一个数组不断的二分,直到不能分为止
  • 然后将不断对比合并
  • 归并排序适用于链表,不需要额外的储存空间。但是对于数组,需要额外的储存空间
    在这里插入图片描述

归并排序的实现

/*
Merge Sort:
1. Time complexity:
   worst case: nlogn
   best case:  nlogn
   averge:     nlogn

2. This is a stable sorting 
3.  merge sort is best for Linked List, since linked list is easy to break and 
   re-linked, there is no additional space required. In addition, merge sort does
   not require insert and traverse methods.
      For an array, merge sort requires additional space (the temp array to store
   sorted value)
*/

package sorting;
import java.util.*;
public class MergeSort {  
	
	public void mergeSort(int [] array) {
		int [] temp = new int[array.length];
		sort(0, array.length-1, array, temp);
	}
	
	private void sort(int left, int right, int [] data, int [] temp) {
	    //只有一个元素时,返回
		if (left >= right) {
			return;
		}
	    
	    //不断的二分,进入递归
		sort(left, (left + right)/2, data, temp);
		sort((left + right)/2 + 1, right, data, temp);
		merge(left, right, data, temp);
	}
	
	private void merge(int start, int end, int [] data, int [] temp) {
		int mid = (start + end) / 2;
		int leftStart = start;
		int rightStart = mid + 1;
		int tempIndex = leftStart;
		
		//合并数组的前半部分和后半部分
		while (leftStart <= mid && rightStart <= end) {
			if (data[leftStart] <= data[rightStart]) {
				temp[tempIndex] = data [leftStart];
				tempIndex++;
				leftStart++;
			}
			else {
				temp[tempIndex] = data [rightStart];
				tempIndex++;
				rightStart++;
			}
		}
		
		//以下两个while loop是为了防止某一部分没有遍历完
		while (leftStart <= mid) {
			temp[tempIndex] = data [leftStart];
			tempIndex++;
			leftStart++;
		}
		
		while (rightStart <= end) {
			temp[tempIndex] = data [rightStart];
			tempIndex++;
			rightStart++;
		}
		//将temp赋值给input array
		for (int i = start; i <= end; i++) {
			data[i] = temp[i];
		}	
	}
}

时间复杂度 和 空间复杂度

  • 时间复杂度:最坏情况,最好情况, 平均情况: O(nlogn)
  • 空间复杂度: 在归并时需要使用一个额外的数组储存元素,所以是 O(n)

稳定性

  • 归并排序是稳定排序
while (leftStart <= mid && rightStart <= end) {
            //只有当这里是 data[leftStart] <= data[rightStart],有等于号才是稳定排序
            //这样靠左的数才能被放到左边
			if (data[leftStart] <= data[rightStart]) {
				temp[tempIndex] = data [leftStart];
				tempIndex++;
				leftStart++;
			}
			else {
				temp[tempIndex] = data [rightStart];
				tempIndex++;
				rightStart++;
			}
		}
		
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

归并排序 mergeSort 的相关文章

  • SpringCloud第一版知识点梳理

    本次文章目录结构如下 1 初识Spring Cloud 1 1 目标 1 2 讲解 1 2 1 技术架构演变 1 2 2 SpringCloud简介 1 3 小结 2 微服务调用 2 1 目标 2 2 讲解 2 2 1 RPC和HTTP 2
  • C++之把流对象当做函数参数传递

    一 编译不通过的代码 File Name main cpp Author zjw Email zjw 0722 163 com Create Time 2015年04月09日 星期四 17时36分02秒 include
  • PyCharm:ModuleNotFoundError: No module named 'selenium'

    今天搭了下selenium环境 遇到了不少坑 幸好爬出来了 火狐63 03 32位 selenium 3 141 0 python 3 7 1 首先介绍下selenium的安装 忘记截图 就文字描述了 1 命令行输入 pip install
  • UE4 场景中的物体高亮显示

    本片博文介绍怎么是场景中的物体进行高亮显示 这里首先要创建一种材质 材质创建如下图所示 大体方法是复制你想高亮的那个物体 然后材质用自己新建的材质 然后把自己创建的物体和原来的物体重合就可以做出物体高亮的效果 感觉这个比用后期盒子处理的要简
  • 神策数据微信小程序 SDK 架构解析

    一 前言 神策数据微信小程序 SDK 1 是一款轻量级用于微信小程序端的数据采集埋点 SDK 包含代码埋点 全埋点功能 其中 全埋点功能通过代理微信小程序原生 App Page Component 接口及相应生命周期函数来实现 下面将以 S
  • selenium webdriver安装和版本不匹配问题

    这篇文章主要是因为系统版本如 92 0 4515 159在webdriver中没有对应版本 chromedriver下载 https npm taobao org mirrors chromedriver 1 在chromedriver下载
  • AngularJs学习笔记--bootstrap

    AngularJs学习笔记系列第一篇 希望我可以坚持写下去 本文内容主要来自 AngularJS 文档的内容 但也加入些许自己的理解与尝试结果 一 总括 本文用于解释Angular初始化的过程 以及如何在你有需要的时候对Angular进行手
  • react+ts项目搭建

    create react app地址 https create react app bootcss com docs getting started npx create react app my app template typescri
  • 实时渲染学习(七)全局光照:光线追踪、路径追踪与GI技术进化编年史

    参考博文 Real Time Rendering 3rd 提炼总结 八 第九章 全局光照 光线追踪 路径追踪与GI技术进化编年史 前言 本章知识概览 全局光照的基本概念 全局光照的算法主要流派 全局光照技术进化编年史 光线追踪 Ray Tr
  • SpringCloud-基础概念及整体架构

    基础概念 01 微服务架构 微服务架构师一种架构模式 它提倡将单一应用程序划分成一组小的服务 服务之间互相协调 互相配合 为用户提供最终价值 每个服务运行在其独立的进程中 服务与服务间采用轻量级的通信机制互相协作 通常是基于HTTP协议的R
  • tcpdump捕获流量,并切分多个文件保存

    tcpdump的文档地址 https www tcpdump org manpages tcpdump 1 html 中文的详细解释可以参考 https www cnblogs com wongbingming p 13212306 htm
  • Vue 使用 Export2Excel.js 导出多 sheet 的 excel

    项目需求 导出多sheet的excel表格 具体思路是 后端返回json数据 前端根据数据和具体的几项字段去导出excel表格 多sheet 多页表格到一个excel表里面 具体思路 根据Export2Excel插件 并修改插件Export
  • 【STM32外部中断使用方法】

    标题STM32外部中断使用方法 1 初始化对应引脚IO 2 初始化中断并配备优先级 void Forword Backword init void EXTI InitTypeDef EXTI InitStructure NVIC InitT
  • 腾讯云S4服务器和SN3ne性能差距大么?如何选择?

    腾讯云服务器SN3ne是标准网络优化型 S4是标准型云服务器 SN3ne实例CPU采用2 5GHz Intel Xeon Skylake 6133 处理器 S4实例CPU采用2 4GHz Intel Xeon Skylake 6148 处理
  • 在SpringBoot项目中配置Redis

    目录 一 前言 二 使用步骤 1 引入start依赖 2 在application yml配置文件中做相应配置 3 配置Redis序列化器 4 将序列化器配置到redisTemplate中 5 封装Redis操作工具类 一 前言 我们知道R
  • #ifdef与#endif的作用及用法

    一般情况下 源程序中所有的行都参加编译 但是有时希望对其中一部分内容只在满足一定条件才进行编译 也就是对一部分内容指定编译的条件 这就是 条件编译 有时 希望当满足某条件时对一组语句进行编译 而当条件不满足时则编译另一组语句 条件编译命令最

随机推荐

  • 论文格式中要求作者加入orcid的链接在名字后边

    论文格式中要求作者加入orcid的链接在名字后边 如下图 使用网上给的各种写法会出现以下问题 1 插入位置不合适 2 出现一个正方形的框 3 所有参考文献带框 与原本论文格式不符 摸索了一个下午 先提供正确的格式 documentclass
  • python字典多键值及重复键值的使用

    在python中使用字典 格式如下 dict key1 value1 key2 value2 在实际访问字典值时的使用格式如下 dict key 多键值 字典的多键值形式如下 dict ke11 key12 value key21 key2
  • python 统计文章单词个数

    代码 def getText txt open article txt r read txt txt lower for ch in lt gt txt txt replace ch return txt hamletTxt getText
  • Android 程序签名问题

    一 多个开发环境具有相同的 debug 签名 在多台机器用 Eclipse 开发 Android 程序的时候 签名不一致导致要反反复复删除原程序才能安装 调试很不爽吧 其实让 Eclipse 用一样的 debug 签名就好了 方法是选中其中
  • 华为OD机试 - 拼接URL(Java)

    题目描述 给定一个url前缀和url后缀 通过 分割 需要将其连接为一个完整的url 如果前缀结尾和后缀开头都没有 需要自动补上 连接符 如果前缀结尾和后缀开头都为 需要自动去重 约束 不用考虑前后缀URL不合法情况 输入描述 url前缀
  • 从零开始学习软件测试-第39天笔记

    接口测试 http消息结构 请求报文 请求行 请求方式 url 协议版本 请求头 空行 请求体 响应报文 响应行 协议版本 状态码 状态消息 响应头 空行 响应体 请求参数类型 path参数 写在路径中的 https xxx xxx com
  • 监控服务器资源定位性能瓶颈,服务端性能监控

    服务端性能监控 内容精选 换一换 JUG Java Salon 11欢迎广大 Java技术开发者或爱好者 参加 Java技术沙龙新一期来了 本次由上海 南京和广东等多地Java用户组 JUG Java User Group 联合主办 还邀请
  • shell排序 C++

    Shell排序算法严格来说基于插入排序的思想 又称为希尔排序或缩小增量排序 Shell排序算 法的排序流程如下 1 将有 n个元素的数组分成n 2 个数字序列 第 1 个数据和第n 2 1 个数据为一对 2 一次循环使每一个序列对排好顺序
  • C# 线程浅谈 (二)

    上一篇写Thread 这一篇写Task 优缺点 百度吧 反正看那个好用用那个 创建控制台程序 新建TaskDom类 还是看怎么创建 怎么使用 怎么带参 怎么返回值 这里都体现了 class TaskDom int count 0 publi
  • 并发库:同步工具类

    1 Semaphore计数信号量 Semaphore计数信号量维护了一个许可集 用于限制访问某些资源的线程数目 并提供同步机制 通俗来说 就是可以控制让多个线程拿到许可 拿到许可的线程可以并发管理同一个资源 这些拿到许可的线程可以看做一个整
  • react、umi、request设置请求头添加token

    1 在utils文件夹里的request js里添加 添加请求头 request interceptors request use url options gt 判断本地session是否有数据 如果有就得到token 并付给请求头 if
  • 循环链表详解(循环单链表/循环双链表)

    目录 一 循环单链表 二 循环双链表 一 循环单链表 循环单链表的表尾结点的next指针总是指向头结点 所以在初始化循环单链表的时候 需要记得将头结点的next指针指向头结点自己 判断循环单链表是否为空 只要判断头结点的next指针是否指向
  • Outlook后台启动及自动隐藏

    1 开机启动 修改注册表 把outlook添加到开机选项中 2 最小化时隐藏 a 启动outlook b 右下角任务栏中 右键勾选 最小化时隐藏 即可 3 将outlook关闭按钮修改为最小化 a 访问 http www reliefjet
  • Python3,网站搭建之数据库表设计及数据存储!文末的彩蛋,我酸了~

    搭建自己的网站 是作为一个码农成功标志之一 那其他成功标志有啥呢 嘿 左手搂着白富美 右手撸着小烧烤 脚底踩着桑塔纳 嗯 这么潇洒的人生 就从数据库表设计及数据存储开始吧 数据库表设计及存储数据 1 爬取数据 2 创建数据库 2 1 创建数
  • 校oj200——带结构体的分数归并排序+字典序人名

    200 给出班里某门课程的成绩单 请你按成绩从高到低对成绩单排序输出 如果有相同分数则名字字典序小的在前 时间限制 2 sec 内存限制 128 MB 试题描述 给出班里某门课程的成绩单 请你按成绩从高到低对成绩单排序输出 如果有相同分数则
  • 在Centos7环境安装MySQL

    0 说明 安装与卸载中 用戶全部切换成为root 初期 mysql先使用root进行 尽快适应mysql语句 后期学习用戶管理 再考虑新建普通用戶 1 从普通用户切换到root用户 2 在root用户目录下创建mysql文件夹 之后MySQ
  • 经典面试题 之 哨兵(Sentinel)模式

    1 什么是哨兵模式 反客为主的自动版 能够自动监控master是否发生故障 如果故障了会根据投票数从slave中挑选一个作为master 其他的slave会自动转向同步新的master 实现故障自动转义 2 原理 sentinel会按照指定
  • 刺激战场怎么战斗服务器响应超时,绝地求生刺激战场网络延迟高怎么办 网络延迟解决方法...

    类型 动作射击大小 669 2M语言 中文 评分 4 0 标签 立即下载 绝地求生刺激战场这款射击游戏很受玩家的喜欢 玩家在游戏中可以随时开局吃鸡 不过这款游戏的网络要求会比较高 不然很然后被杀死 那绝地求生刺激战场网络延迟高怎么办 西西小
  • 【美赛】2023年MCM问题Y:理解二手帆船价格(代码&思路)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 数据与术语表 2 1 数据 2 2 术语表 3 超级软件分享与资源下载 3 1 软件分享 3 2 资源
  • 归并排序 mergeSort

    归并排序 mergeSort 基本概念 归并排序的实现 时间复杂度 和 空间复杂度 稳定性 基本概念 将一个数组不断的二分 直到不能分为止 然后将不断对比合并 归并排序适用于链表 不需要额外的储存空间 但是对于数组 需要额外的储存空间 归并