归并排序模板以及求解逆序对模板

【基础算法】归并排序(Merge sort)图文详解,附模板 归并排序采用“分治”思想,在一组待排序的数字中,从中间将数组断成两段,进行递归处理,处理完成后左右两段已经是有序的了,再将左右两段进行合并。即“先分后合”,将原问题分割为子问题,逐个解决后再合并,得到原问题的结果。 阅读详情

归并排序:

#include<iostream>
using namespace std;
int num[1005]; //输入数组&答案数组 
int temp[1005]; //中转数组 
void merge(int l,int r,int mid)
{
	int i=l,j=mid,p=l;
	while(i<mid&&j<r)//左右两边打擂 
	{
		if(num[i]<num[j])//左边输了(左边比较小) 
			temp[p++]=num[i++]; //将左边输了的元素放到有序数组中 
		else//右边输了(右边比较小) 
			temp[p++]=num[i++];//将右边输了的元素放到有序数组中 
	}
	while(i<mid) //看看左边是否还有余党 
	{
		temp[p++]=num[i++];//因为一定是有序的,所以直接放进去就好 
	}
	while(j<=r)  //看看右边是否还有余党 
	{
		temp[p++]=num[j++];//因为一定是有序的,所以直接放进去就好 
	}
	p=l;
	i=l;
	while(p<=r) //将排序好的temp数组复制到num答案数组中 
	{
		num[i++]=temp[p++];
	}
}
void merge_sort(int l,int r)
{
	if(l<r)
	{
		int mid=(l+r)/2;//计算中间元素的下标 
		merge_sort(l,mid);//递归拆分左边 
		merge_sort(mid+1,r);//递归拆分右边 
		merge(l,r,mid+1);//拆分完毕,开始归并 
	}
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;++i)
	{
		cin>>num[i];
	}
	merge_sort(1,n);
	for(int i=1;i<=n;++i)
	{
		cout<<num[i]<<" ";
	}
	return 0;
}

基于归并排序的求解逆序对模板(学长写的):

#include <bits/stdc++.h>
using namespace std;

typedef long long ll;

const int M = (int)1e6;
const int mod = (int)1e8 + 7;

int n;
ll a[M + 5];
ll b[M + 5];

ll merge_sort(ll a[], int l, int r)
{
    if(l >= r) return 0;
    int mid = (l + r) >> 1; ll cnt = (merge_sort(a, l, mid) + merge_sort(a, mid + 1, r)) % mod;
    int i = l, j = mid + 1, k = 0;
    while(i <= mid && j <= r) if(a[i] <= a[j]) b[++k] = a[i++]; else b[++k] = a[j++], (cnt += mid - i + 1) %= mod;
    while(i <= mid) b[++k] = a[i++];
    while(j <= r)   b[++k] = a[j++];
    for(int i = l, j = 1; i <= r; ++i, ++j) a[i] = b[j];
    return cnt;
}

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]);
    printf("%lld\n", merge_sort(a, 1, n));
    return 0;
}

还有一个长得和归并排序差不多的:

#include<iostream>
#include<cstdio>
using namespace std;
typedef long long ll;
const ll maxn=1000000;
const ll mod=100000007;
ll s1[maxn+5];
ll s2[maxn+5];
ll cnt=0;
void merge(ll L, ll R, ll Mid){
    ll i = L;ll j = Mid + 1;ll k = L;
    while(i <= Mid && j <= R){
        if(s1[i] <= s1[j])s2[k ++] = s1[i ++];
        else{
            cnt += Mid - i + 1;
            //对于i到Mid这Mid - i + 1个数字(假设它为j),每一个a[j]都与a[i]构成了一个逆序对
            s2[k ++] = s1[j ++]; 
        }
    }
    while(i <= Mid)s2[k ++] = s1[i ++];
    //对于每个j都已讨论完,每个j钱比他大的数都已计入cnt,所以此时不用更新cnt
    while(j <= R)s2[k ++] = s1[j ++];
    for(i = L; i <= R; i ++)s1[i] = s2[i]; 
}
void mergesort(ll L,ll R){
    if(L < R){
        ll Mid = (L + R) / 2;
        mergesort(L, Mid),mergesort(Mid + 1, R);
        merge(L, R, Mid);
    }
}
int main(){
	ll n;
	scanf("%lld", &n);
	for(ll i = 1; i <= n; i ++)scanf("%lld", &s1[i]);
	mergesort(1, n);
	printf("%lld", cnt%mod);
}
单机多环境部署apollo 2.3.0 理解apollo的整体架构后,对比nacos配置中心功能点,其设计的复杂度以及完整度相较nacos而言更为丰富 对于不同的环境,例如 FAT, PRO 在部署时进程已经完全物理隔离,并且每个环境config/adminservice依赖的数据也完全物理隔离(连接不同的db),在数据隔离与安全方面做的很完善,但同时也提升了架构的复杂度 而 portal 可以管理多个环境,单节点部署虽然有单点问题,但并不会影响业务从configservice读取配置, 挂掉只要重启就可以,只是在 阅读详情

相关推荐

Diebold-Mariano检验

给定两个预测的预测结果,我们希望比较他们的预测结果,以用于预测模型精度的比较。 Diebold-Mariano检验本质是一个t检验,用于检验替代预测的两个损失序列的平均值是否相等。即,它是一系列损失差的零均值的t检验。在存在自相关的情况下,它使用损失差分时间序列标准差的自相关一致性估计。 注意,在使用DM检验式时,假设损失序列是平稳的。 另外,DM检验在小样本数据时往往会拒绝零假设。对于小样本数据,推荐Harvey, Leybourne and Newbold (HLN)检验【1】; 参考文献 【1】htt

weixin_43948357的博客 6565

归并排序(手写)

题目: 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式: 输入共两行,第一行包含整数 n。 第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。 输出格式: 输出共一行,包含 n 个整数,表示排好序的数列。 数据范围 1 ≤ n≤ 100000 输入样例: 5 3 1 2 4 5 输出样例: 1 2 3 4 5 #include<bits/stdc++.h> using namespace std

loi_王振东 749

qemu-system-aarch64参数详解与实战配置指南

本文详细解析了qemu-system-aarch64的核心参数,包括-machine、cpu、smp、m、drive和netdev等关键配置。通过嵌入式内核调试、完整系统运行和外设模拟三大实战场景,提供可直接使用的配置示例与性能优化技巧,帮助开发者在x86主机上高效构建和调试ARM64虚拟环境。

weixin_29197051的博客 353

【归并排序模板】

归并排序(Merge Sort)是一种基于分治思想的排序算法,它将待排序序列分成两个子序列,分别对子序列进行排序,然后将两个有序的子序列合并成一个有序的序列。将待排序序列分成两个子序列,直到每个子序列只有一个元素。对每个子序列进行排序,可以使用递归调用归并排序。将两个有序的子序列合并成一个有序的序列,得到最终的排序结果。归并排序的时间复杂度为O(nlogn),其中n是待排序序列的长度。归并排序是一种稳定的排序算法,它的空间复杂度为O(n),需要额外的空间来存储临时的子序列。

学习愚公的博客 234

SpringAi 通过大模型来实现调用自己的Api

摘要 本文介绍了如何利用Spring AI的Tools机制扩展大模型能力,实现业务系统集成。通过@Tool和@ToolParam注解定义工具方法,将订单查询和关闭功能暴露给大模型调用。关键实现包括:1)使用详细描述标注工具方法和参数;2)在ChatClient中注册工具服务;3)集成对话记忆保持上下文。该方法使AI具备操作业务系统的能力,形成"认知-决策-执行"闭环,大幅提升了模型在实际业务场景中的应用价值。

又要搬砖了 836

Abaqus子程序开发避坑指南:从UMESHMOTION到齿轮磨损分析实战

本文深入探讨Abaqus子程序开发中的关键技术与避坑指南,重点解析UMESHMOTION在齿轮磨损分析中的实战应用。从开发环境搭建、调试框架构建到性能优化和大规模计算,提供系统化的解决方案。通过真实案例展示如何避免内存泄漏、网格畸变等常见问题,并介绍数据驱动的磨损预测等前沿技术,帮助工程师提升仿真精度与效率。

weixin_30892037的博客 88

[排序] 快速排序、归并排序模板(模板)

文章目录0. 前言1. 快速排序2. 归并排序 0. 前言 正经人谁手写这玩意? 1. 快速排序 785. 快速排序 本质: 分治。是不稳定的排序算法。 时间复杂度:O(nlogn)O(nlogn)O(nlogn) 空间复杂度:O(logn)O(logn)O(logn),基于递归,用到栈空间 模板注意点: 注意点就是不要随便改动里面的任何一个下标… 快排边界情况很多很多,这是个经过千锤百炼的模板代码,理解算法思想后背过模板就行了 基准值 int x = q[l+r>>1],写成 int x

Y-puyu 的博客 612

软件测试高频面试题 2026 最新整理(功能 + 自动化)

本文系统整理了2026年软件测试面试高频题目及参考答案,涵盖功能测试、自动化测试及新兴热点领域。功能测试部分包含测试基础概念、用例设计方法、缺陷管理流程等10个必背题;自动化测试部分详细解析工具选择、元素定位、框架搭建等10个热门考点;新增章节聚焦AI测试、安全测试、性能指标等5个前沿话题。参考答案均采用结构化表述,包含定义、区别、适用场景等关键要素,并强调结合项目经验作答。文末提供2026版面试技巧,建议采用"结论-分点-总结"的回答逻辑,重点展现问题解决能力和技术前瞻性。

SmallBull的博客 1968

一文读懂『归并排序』算法(Merge Sort)(含算法模板)

一文读懂『归并排序』算法(Merge Sort)(含算法模板)

qq_40430360的博客 4800

Docker 实战:使用 Docker Desktop 在 MacOS 上安装 Docker

在这采用 Docker Desktop 在 Mac 上来安装 Docker。Docker Desktop 是 Docker 的管理桌面 IDE,提供了一个直观的GUI(图形用户界面),允许您直接在本机上管理容器、应用程序以及镜像。适用于 Mac、Linux 以及 Windows 环境,允许您构建、共享和运行容器化应用程序和微服务。Docker Desktop 可以大大降低在复杂配置上的时间,因此您可以专注于编写代码。它负责端口映射、文件系统问题和其他默认设置,并定期更新 Bug 修复和安全更新。

SmartSi 8007

vue3 - element-plus表格组件el-table实现鼠标拖曳排序功能,vue3 Table表格拖拽排序,表格每行使用鼠标拖动进行排序功能,表格拖拽排序实现(详细示例代码,一键复制开箱即用

vue3,elementPlus,el-table,typescript,表格组件,Table表格,表格拖动排序,表格拖曳排序,鼠标拖拽表格进行排序功能,elementplus表格如何实现拖动每行进行排序操作,表格拖动改变顺序,鼠标拖曳,表格内的数据项拖拽排序,vue3如何实现element-Plus表格组件进行表格内的数据项拖拽排序,列表拖拽排序效果,实现table动态拖拽,鼠标拖着排序,vue3 element Plus 表格拖曳拖动拖拽 排序,el-table拖拽排序实现,表格内容拖拽重新排序,树形表

✅ 精选推荐文章 1万+

基础算法第五期 逆序对的数目(暴力+归并排序讲解)

上网搜了一下:设 A 为一个有 n 个数字的有序集 (n>1),其中所有数字各不相同。如果存在正整数 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],则 <A[i], A[j]> 这个有序对称为 A 的一个逆序对,也称作逆序数。

2301_80882026的博客 944

Orange3实战教程:转换---预处理

部件提供了多种预处理方法,这些方法可以在单个预处理流程中组合使用。某些方法也可作为独立部件提供,支持更高级的技术和参数调整。连接到测试与评分:在交叉验证的每个批次中应用预处理器,随后学习器的预处理器会作用于预处理后的子集。连接到学习器:覆盖学习器的默认预处理流程,仅应用自定义流程(各学习器的默认步骤详见其文档)。直接连接到原始数据并输出预处理后的数据集,可能导致模型过拟合。:从原始数据中随机选择固定数量或百分比的特征,主要用于高级测试或教学用途。的预处理器输入,同时传入数据和学习器(如。

err2008的专栏 147

逆序对数量(归并排序做法)

利用归并排序过程求逆序对

m0_74758366的博客 479

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

排序模板+求逆序对(归并的思想)

快速排序模板: void quick_sort(int l,int r){ if(l>=r) return ; int i=l-1,j=r+1,tmp=a[l+r>>1]; while(i<j){ do j--; while(a[j]>tmp); do i++; while(a[i]<tmp); if(i<j) swap(a[i],a...

red_red_red的博客 203

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

逆序对数量

逆序对 简述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 样例输入 7 5 6 4 样例输出 5 /* 1. 此处仅仅提供样例代码 */ ...

weixin_43855206的博客 172

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

每日一题——逆序对 (归并排序)

大家好,我是爬行系,今天打卡的是求数组的逆序对,其实归并排序模板的直接套用就可以啦! 文章目录归并排序题目详解AC代码 (归并排序模板) 归并排序 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用,重点在于合并。 1.分解:将n个元素分成个含n/2个元素的子序列。 2.解决:用合并排序法对两个子序列递归的排序。 3.合并:合并两个已排序的子序列已得到排序结果。 题目详解 题目描述 猫猫 TOM 和小老鼠 JERRY 最近又较量上了,但.

GAL555的博客 718

算法刷题day24:归并排序

关于这个归并排序,考察的还是挺多的,在笔试面试中会问你,或者直接让你写一个归并排序,还有竞赛中有时也会考察,不过一般都是小题,主要是考察递归和递推,看你对这个过程的理解,所以还是很重要的,加油!

weixin_60033897的博客 824

基础算法——快速排序with归并排序

本文介绍了两种经典排序算法的实现模板:快速排序和归并排序。快速排序通过选取基准值将数组分为两部分递归排序,时间复杂度平均为O(nlogn),但不稳定。归并排序采用分治思想,将数组二分后归并,时间复杂度稳定为O(nlogn)。文中还给出了利用归并排序统计逆序对数量的例题,通过修改归并过程,在合并有序子数组时统计跨越中点的逆序对,总逆序对数等于左半、右半和跨越中点的逆序对之和。两种排序算法各具特点,适用于不同场景的需求。

qq_73614572的博客 233

1.2归并排序(分治法)

#include <iostream> #include <cstdio> #include <algorithm> #define INF 2147483647 using namespace std; int n,num[500005],L[250005],R[250005]; long long ans=0; void myMerge(int l,int r,int m)//l-m m+1-r { int n1=m-l+1,n2=r-m; for(

开学菜成狗 160

排序算法:快速排序和归并排序

快排 快排模板 //快排模板 void quick_sort(int q[], int l, int r) { if (l >= r) return; // 不能是==, 因为区间可能没有数 int i = l - 1, j = r + 1, x = q[l + r >> 1]; //第12行如果用j,这一行x不能用x=q[r],会导致死循环 ...

aje51173的博客 176

ACM练级日志: CodeForces 414C 归并排序、逆序数和栈内存

时间一长居然连归并排序都忘了怎么写了…… 偏偏这玩意还不能用STL,必须手写…… 而且这道题又是递归又是取反又是求和,真心麻烦,费了我一个上午才弄出来……期间还遇上了各种各样的问题。 记录一下归并排序:开数组的时候没什么特殊情况就开在全局变量里,然后tmp数组也可以开在全局变量里,由于栈内存的限制,不要把局部变量开得很大,通常栈内存只有可怜的16MB,稍微奢侈一点就爆了……而且爆

暗黑ZX Cyberwind 1008

算法刷题总结—常用排序算法

本文介绍了面试过程中最常用的两个排序算法和二分查找算法,算法模板应时刻牢记于心。

qq_54780782的博客 121

蓝桥杯备赛打卡Day 11~Acwing 505. 火柴排队

本题运用到归并排序求逆序对,以及将a数组映射成有序数组,并反过来映射到b数组,再求b数组的逆序对。答案的情况即为a数组和b数组同为递增有序对。归并排序模板有些生疏了,得再好好记一记。work函数还没完全搞懂。

2302_79368415的博客 294

分治算法:从快排到归并排序的实战指南

欢迎来到丘山望岳的小栈,今天分享分治算法,从熟络的快排归并讲起,话不多说,我们现在发车。

2501_94762791的博客 247

inversions

a n. He is allowed to swap two adjacent(相邻) numbers for no more than k times. Find the minimum number of inversions after his swaps. Note: The number of inversions is the number of pair (i,j) where 1≤ia j.此题是一道求逆序对数量的题目,我们利用归并排序。

weixin_62063623的博客 503
上一篇: SDNUOJ 1086.迷宫问题(bfs+记录路径)
下一篇: 约瑟夫环问题
Konjacer
博客等级 码龄9年 18粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值