数据结构-八大排序之归并排序

归并排序

一、概念

归并排序(Merge sort)是建立在归并操作上的一种有效、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

二、思路

拆分,再合并,在合并的过程中结束临时空间进行排序。

拆分:从中间位置拆开,数据分成左右两部分,继续进行拆分,直到数据拆分成一个一个的时候停止。

向左拆分:right = mid   (/mid-1)   

向右拆分:left = mid+1  (/mid)

eg:

合并有序序列:

两个序列定义两个指针,分别指向有序序列的第一个值,比较两指针指向的数据大小,把大的一方放到新的空间中。


三、时间复杂度 

在上述例子中(5,7,4,2,0,3,1,6)

第一层   1   2^0

第二层   2   2^1

第三层   4  2^2

第四层   8   2^3

第k层  2^(k-1) =x

k=log2x      O(nlogn)


四、代码

递归结束出口:left==right

else

向左拆分:  f(arr,left,right)= f(arr,left,mid)

向右拆分:  f(arr,left,right)= f(arr,mid+1,right)

package com.lojarro.排序;

import java.util.Arrays;

public class MergeSort {
	public static void main(String[] args) {
		int[] arr= {12,3,32,11,-1,33,11,123,12,56};
		mergeSort(arr,0,arr.length-1);
		System.out.println(Arrays.toString(arr));
	}
	//拆分
	public static void mergeSort(int[] arr, int left, int right) {
		//递归出口
		if(left==right) {
			return;
		}
		int mid=(left+right)/2;
		//向左拆分
		mergeSort(arr,left,mid);
		//向右拆分
		mergeSort(arr,mid+1,right);
		
		//合并
		merge(arr,left,right,mid);
	}
	public static void merge(int[] arr,int left,int right,int mid) {
		//定义第一段和第二段的开始
		int s1=left;
		int s2=mid+1;
		//定义临时空间
		int[] temp =new int[right-left+1];
		int index=0;//定义游标遍历临时空间
		//判断s1和s2指向的数据大小,将其存入临时数组
		while(s1<=mid&&s2<=right) {
			if(arr[s1]<arr[s2]) {
				temp[index]=arr[s1];
				s1++;
				index++;
			}else {
				temp[index]=arr[s2];
				s2++;
				index++;
			}
		}
		//判断s1中是否有数据,如果有将其放入临时数组当中
		while(s1<=mid) {
			temp[index]=arr[s1];
			s1++;
			index++;
		}
		//判断s2中是否有数据,如果有将其放入临时数组当中
		while(s2<=right) {
			temp[index]=arr[s2];
			s2++;
			index++;
		}
		//将临时数组中的数据写回原数组
		for(int i=0;i<temp.length;i++) {
			arr[left+i] = temp[i];
		}
	}
}

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

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

相关文章

友思特技术 | 视觉阶梯发展:传感器材料对短波红外成像技术的影响

导读 短波红外成像技术的发展受到了传感器材料种类的限制与推动&#xff0c;从硅基到铟镓砷&#xff0c;从量子点到锗基&#xff0c;丰富的材料影响着短波红外相机的分辨率、质量、成本等性能特征。 短波红外成像与传感器 短波红外光通常定义在 900 - 1700nm&#xff0c;相比…

使用 Python 处理 CSV 文件

文章目录 常见问题及解决方案使用 Python 处理 CSV 文件&#xff1a;全面指南CSV 文件的基本概念使用内置 csv 模块使用 pandas 库处理缺失值使用 DictReader 和 DictWriter案例分析最佳实践参考资源性能比较结论 常见问题及解决方案 问题&#xff1a;文件编码错误 解决方案&am…

大厂为什么要禁止使用数据库自增主键

大表为何不能用自增主键&#xff1f; 数据库自增主键&#xff0c;以mysql为例&#xff0c;设置表的ID列为自动递增&#xff0c;便可以在插入数据时&#xff0c;ID字段值自动从1开始自动增长&#xff0c;不需要人为干预。 在小公司&#xff0c;或者自己做项目时&#xff0c;设置…

Ollama 离线安装

1. 查看服务器CPU的型号 ## 查看Linux系统CPU型号命令&#xff0c;我的服务器cpu型号是x86_64 lscpu 2. 根据CPU型号下载Ollama安装包&#xff0c;并保存到/home/Ollama目录 我下载的是Ollama的v0.1.31版本&#xff0c;后面均以此版本为例说明 下载地址 https://github.…

拴柱说Mac之Mac的高效使用技巧第三期

Mac的设计有着非常多的使用技巧&#xff0c;这些技巧能够极大的提高你的使用效率&#xff0c;但是还是有许多人并不知道&#xff0c;那么今天Mac高效使用技巧分享第三期来了 Mac有一个独特的设置&#xff0c;那就触发角&#xff0c;触发角有着非常多的妙用 在 “系统偏好设置…

为什么计算机科学存在图灵机和Lambda演算两种世界观,而量子力学却存在三种世界图景?

计算机科学存在两种基本的世界观&#xff1a;图灵机和Lambda演算&#xff0c;它们指出了到达图灵完备的两条技术路线。但是量子力学中却存在着三种世界图景&#xff1a;薛定谔图景&#xff0c;海森堡图景和狄拉克图景。为什么计算机科学有两种基本世界观&#xff0c;但是量子力…

【Python数据可视化】利用Matplotlib绘制美丽图表!

【Python数据可视化】利用Matplotlib绘制美丽图表&#xff01; 数据可视化是数据分析过程中的重要步骤&#xff0c;它能直观地展示数据的趋势、分布和相关性&#xff0c;帮助我们做出明智的决策。在 Python 中&#xff0c;Matplotlib 是最常用的可视化库之一&#xff0c;它功能…

Netty-TCP服务端粘包、拆包问题(两种格式)

前言 最近公司搞了个小业务&#xff0c;需要使用TCP协议&#xff0c;我这边负责服务端。客户端是某个设备&#xff0c;客户端传参格式、包头包尾等都是固定的&#xff0c;不可改变&#xff0c;而且还有个蓝牙传感器&#xff0c;透传数据到这个设备&#xff0c;然后通过这个设备…

使用ORDER BY排序

在一个不明确的查询结果中排序返回的行。ORDER BY子句用于排序。如果使用了ORDER BY子句&#xff0c;它必须位于SQL语句的最后。 SELECT语句的执行顺序如下&#xff1a; 1.FROM子句 2.WHERE子句 3.SELECT子句 4.ORDER BY子句 示例一&#xff1a;查询employees表中的所有雇…

通俗易懂的入门 Axure RP文章 ,速学

目录 1. Axure RP简介&#xff1f; 2. Axure RP基本操作 &#xff08;1&#xff09;入门理解 &#xff08;2&#xff09;插入形状 &#xff08;3&#xff09;位置对齐、 &#xff08;4&#xff09;资源库 3. Axure RP基本交互 &#xff08;1&#xff09;切换不同的页面 …

进程间通信大总结Linux

目录 进程间通信介绍 进程间通信目的 进程间通信发展 进程间通信分类 管道 System V IPC POSIX IPC 管道 什么是管道 匿名管道 用fork来共享管道原理 站在文件描述符角度-深度理解管道 管道读写规则 管道特点 命名管道 创建一个命名管道 匿名管道与命名管道的区…

《云原生安全攻防》-- K8s攻击案例:权限维持的攻击手法

在本节课程中&#xff0c;我们将一起深入了解K8s权限维持的攻击手法&#xff0c;通过研究这些攻击手法的技术细节&#xff0c;来更好地认识K8s权限维持所带来的安全风险。 在这个课程中&#xff0c;我们将学习以下内容&#xff1a; K8s权限维持&#xff1a;简单介绍K8s权限维持…

UG2312软件安装教程+Siemens NX三维建模中文安装包下载

一、软件下载 【软件名称】&#xff1a;UG 2312 【支持系统】&#xff1a;win10/win11 【百度网盘】&#xff1a; https://pan.baidu.com/s/1oF-X29m1f5pDhElwi0rK8A?pwd70zi 二、UG NX软件 UG&#xff08;Unigraphics NX&#xff09;是一款集 CAD、CAM、CAE 于一体的高效…

大范围实景三维智能调色 | 模方自动化匀色解决方案

《实景三维中国建设总体实施方案&#xff08;2023—2025年&#xff09;》、《实景三维中国建设技术大纲》等相关文件中指出&#xff0c;倾斜Mesh三维模型修饰要求模型整体色彩真实&#xff0c;无明显色差。9月&#xff0c;自然资源部在国务院新闻发布会上表示&#xff0c;实景三…

Linux:线程及其控制

我们已经学了线程的创建&#xff0c;现在要学习线程的控制 线程等待 我们来先写一个没有线程等待的代码&#xff1a; pthcon.c: #include<stdio.h> #include<pthread.h> void* gopthread(void* arg){while(1){printf("pthread is running\n");sleep(1…

银行客户贷款行为数据挖掘与分析

#1024程序员节 | 征文# 在新时代下&#xff0c;消费者的需求结构、内容与方式发生巨大改变&#xff0c;企业要想获取更多竞争优势&#xff0c;需要借助大数据技术持续创新。本文分析了传统商业银行面临的挑战&#xff0c;并基于knn、逻辑回归、人工神经网络三种算法&#xff0…

SpringBoot实现微信支付接口调用及回调函数(商户参数获取)

#1024程序员节 | 征文 # 一、具体业务流程 1. 用户下单 - 前端操作&#xff1a; - 用户在应用中选择商品、填写订单信息&#xff08;如地址、联系方式等&#xff09;&#xff0c;并点击“下单”按钮。 - 前端将订单信息&#xff08;商品ID、数量、价格等&#xff09;发送…

Pytorch 实现图片分类

CNN 网络适用于图片识别&#xff0c;卷积神经网络主要用于图片的处理识别。卷积神经网络&#xff0c;包括一下几部分&#xff0c;输入层、卷积层、池化层、全链接层和输出层。 使用 CIFAR-10 进行训练&#xff0c; CIFAR-10 中图片尺寸为 32 * 32。卷积层通过卷积核移动进行计…

C++ —— map系列的使用

目录 1. map和multimap参考文档 2. map类的介绍 3. pair 4. map的增删查 4.1 插入 4.2 删除 4.3 查找 5. map的数据修改 6. map的operator[] 7. multimap和map的差异 1. map和multimap参考文档 - C Referencehttps://legacy.cplusplus.com/reference/map/ 2. map类的…

04 springboot-工程搭建案例(多环境部署,数据源, Swagger, 国际化,工具类)

项目搭建模板(多环境切换) springboot系列&#xff0c;最近持续更新中&#xff0c;如需要请关注 如果你觉得我分享的内容或者我的努力对你有帮助&#xff0c;或者你只是想表达对我的支持和鼓励&#xff0c;请考虑给我点赞、评论、收藏。您的鼓励是我前进的动力&#xff0c;让我…