【归并排序】 详细解析 动图演示 逐图解析 洛谷P1177【模板】排序 sort【快速排序】

本文主要是介绍【归并排序】 详细解析 动图演示 逐图解析 洛谷P1177【模板】排序 sort【快速排序】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 归并排序
      • 1.归并排序的复杂度分析
      • 2.细节解释
      • 3.归并排序动图演示
        • 3(1) 我们的拆分过程如下↓
      • 4.code↓
    • 洛谷P1177【模板】排序
      • 数据规模与约定
      • code(归并排序)↓
      • code(sort排序【快速排序】)
    • 完结撒花( ̄▽ ̄) /

归并排序

归并排序(merge sort)是高效的基于比较的稳定排序算法。

1.归并排序的复杂度分析

归并排序的时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

归并排序的空间复杂度 O ( n ) O(n) O(n)(这是因为他不是原地排序算法

2.细节解释

( l + r ) > > 1 = ( l + r ) ÷ 2 1 = ( l + r ) ÷ 2 (l+r)>>1=(l+r)\div 2^{1}=(l+r)\div 2 (l+r)>>1=(l+r)÷21=(l+r)÷2;

3.归并排序动图演示

在这里我们是默认了它以中间为节点分别排成了从大到小两个序列

这是因为有merge_sort(q,l,mid),merge_sort(q,mid+1,r)不断进行拆分的原因

3(1) 我们的拆分过程如下↓

在这里插入图片描述

这里的动图演示先执行了下方代码

	int k=0,i=l,j=mid+1;//i表示左半边的开始,j表示右半边的开始,k表示合并的个数while(i<=mid&&j<=r){//对半分后,mid是i的终点,r是j的终点if(q[i]<=q[j])  tmp[k++]=q[i++];//不断将tmp填充,i++else tmp[k++]=q[j++];//else 等同于if(q[i]>q[j]) }

q[i]q[j]已经超过了他们的终点i终点midj终点r),那么就执行下方代码

	while(i<=mid) tmp[k++]=q[i++];//将i没有填充完的继续进行填充while(j<=r) tmp[k++]=q[j++];//将j没有填充完的继续进行填充

执行上方代码时一定有一个值(i or j) 是已经超过了他们的终点的,不然不会退出循环,所以不用考虑大小关系

执行上方代码是为了将剩下的可以填充的数填充进tmp数组里,以此来保证没有遗漏

动图演示↓
在这里插入图片描述

4.code↓

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n,a[maxn] ,tmp[maxn];
void merge_sort(int q[],int l,int r){//要排序的数组,左边界,有边界if(l>=r) return;//不满足要求int mid=(l+r)>>1;//m是l+r的中间值,(l+r)>>1=(l+r)/(2^{1})=(l+r)/2;merge_sort(q,l,mid),merge_sort(q,mid+1,r);//不断将它进行拆分,然后归并int k=0,i=l,j=mid+1;//i表示左半边的开始,j表示右半边的开始,k表示合并的个数while(i<=mid&&j<=r){//对半分后,mid是i的终点,r是j的终点if(q[i]<=q[j])  tmp[k++]=q[i++];//不断将tmp填充,i++else tmp[k++]=q[j++];//else 等同于if(q[i]>q[j]) }while(i<=mid) tmp[k++]=q[i++];//将i没有填充完的继续进行填充while(j<=r) tmp[k++]=q[j++];//将j没有填充完的继续进行填充for(int i=l,j=0;i<=r;i++,j++){q[i]=tmp[j];//将已经排好序的(tmp[l]~tmp[r])给赋值到q数组}
}
int main(){ios::sync_with_stdio(false);//加速cincin.tie(0),cout.tie(0);cin>>n;for(int i=0;i<n;i++){cin>>a[i];//输入数列}merge_sort(a,0,n-1);//进行排序for(int i=0;i<n;i++){cout<<a[i]<<" ";//进行排好序了的进行输出}return 0;
}

洛谷P1177【模板】排序

题意:将读入的 N N N个数从小到大排序后输出

数据规模与约定

对于 20 % 20\% 20% 的数据,有 1 ≤ N ≤ 1 0 3 1 \leq N \leq 10^3 1N103

对于 100 % 100\% 100% 的数据,有 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^5 1N105 1 ≤ a i ≤ 1 0 9 1 \le a_i \le 10^9 1ai109

code(归并排序)↓

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n,a[maxn] ,tmp[maxn];
void merge_sort(int q[],int l,int r){if(l>=r) return;int mid=(l+r)>>1;merge_sort(q,l,mid),merge_sort(q,mid+1,r);int k=0,i=l,j=mid+1;while(i<=mid&&j<=r){if(q[i]<=q[j])  tmp[k++]=q[i++];else tmp[k++]=q[j++];}while(i<=mid) tmp[k++]=q[i++];while(j<=r) tmp[k++]=q[j++];for(int i=l,j=0;i<=r;i++,j++){q[i]=tmp[j];}
}
int main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n;for(int i=0;i<n;i++){cin>>a[i];}merge_sort(a,0,n-1);for(int i=0;i<n;i++){cout<<a[i]<<" ";}return 0;
}

code(sort排序【快速排序】)

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int n,a[maxn]={};
int main(){cin>>n;for(int i=1;i<=n;i++) cin>>a[i];sort(a,a+1+n);for(int i=1;i<=n;i++) cout<<a[i]<<" ";return 0;
}

完结撒花( ̄▽ ̄) /

这篇关于【归并排序】 详细解析 动图演示 逐图解析 洛谷P1177【模板】排序 sort【快速排序】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/773995

相关文章

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

Goland debug失效详细解决步骤(合集)

《Golanddebug失效详细解决步骤(合集)》今天用Goland开发时,打断点,以debug方式运行,发现程序并没有断住,程序跳过了断点,直接运行结束,网上搜寻了大量文章,最后得以解决,特此在这... 目录Bug:Goland debug失效详细解决步骤【合集】情况一:Go或Goland架构不对情况二:

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri