分治算法 求数组逆序数

分治法求解逆序数问题 阅读详情

题目:在数组中的两个数字如果前面一个数字大于后面一个数字 则这两个数字组成一个逆序对 输入一个数组 求这个数组中逆序对的个数


先把数组分割成子数组 先统计出子数组内部的逆序对的数目 然后再统计出两个相邻子数组之间的逆序对的数目 统计逆序对的过程中 还需要对数组进行排序 这类似与归并排序 算法的时间复杂度为O(nlogn) 空间复杂度为O(n)


归并排序


#include<iostream>
using namespace std;
void merge(int *A, int *temp, int start, int mid, int end)
{
	int a = start;
	int b = mid+1;
	int c = end;
	int d = start;

	while (a <= mid && b <=end )
	{
		if (A[a] < A[b])
			temp[d++] = A[a++];
		else
			temp[d++] = A[b++];
	}
	while (a != mid + 1)
		temp[d++] = A[a++];
	while (b != end + 1)
		temp[d++] = A[b++];
	for (int i = start;i <= end;i++)
		A[i] = temp[i];
}

void sortg(int *A,int *temp ,int a,int b)
{
	if (a < b)
	{
		int mid = a + (b - a) / 2;
		sortg(A, temp, a, mid);
		sortg(A, temp, mid + 1, b);
		merge(A, temp, a, mid, b);
	}
}
int main()
{
	int A[] = { 7,4,10,6,9,9,2,3 };
	int n = 8;
	int *t = new int[n];
	memset(t, 0, sizeof(int)*n);
	sortg(A, t, 0, n - 1);
	for (int i = 0;i < n;i++)
		cout << A[i] << ' ';
	delete[]t;
		return 0;
}






求逆序对数~~~


#include<iostream>
using namespace std;

int merge(int *A, int *temp, int start, int mid, int end)
{
	int a = end;
	int b = mid;
	int c = end;
	int t = 0;
	while (b >= start && a >= mid + 1)
	{
		if (A[b] > A[a])
		{
			temp[c--] = A[b--];
			t += a - mid;
		}
		else
			temp[c--] = A[a--];
	}
	while (a >= mid + 1)
		temp[c--] = A[a--];
	while (b >= start)
		temp[c--] = A[b--];
	for (int i = start;i <= end;i++)
		A[i] = temp[i];
	return t;
}
int  Nimum(int *A, int *temp, int a, int b)
{

	if (a==b)
		return 0;
	else
	{
		int mid = a + (b - a) / 2;
		int left=Nimum(A, temp, a, mid);
		int right=Nimum(A, temp, mid + 1, b);
		int num=merge(A, temp, a, mid, b);
		return left + right + num;
	}
}
int main()
{
	int A[] = { 7,4,5,3,8,2};
	int n =6;
	int *t = new int[n];
	memset(t, 0, sizeof(int)*n);
	int num=Nimum(A, t, 0, n - 1);
	for (int i = 0;i < n;i++)
		cout << A[i] << ' ';

	cout << endl<< num << endl;
	delete[]t;
	return 0;
}



分治法求数组中的逆序数 有一实数序列a1,a2,....an,若iaj,则(ai,aj)形成了一个逆序对,请使用分治算法求整个序列中逆序对个数,并分析算法时间复杂度。 立即下载

相关推荐

基于STM32 FOC下桥三电阻采样方式的电机相电流重构方法

如何提高三电阻采样的调制率

wanrenqi的博客 9198

分治法 —— 求逆序对个数 (归并排序应用2)

求逆序对个数 题目描述 有一实数序列A[1]、A[2] 、A[3] 、……A[n-1] 、A[n] (n<10000),若i<j,并且A[i]>A[j],则称A[i]与A[j]构成了一个逆序对,求数列A中逆序对的个数。 例如,5 2 4 6 2 3 2 6,可以组成的逆序对有 (5 2),(5 4),(5 2),(5 3),(5 2), (4 2),(4 3),(4 2), (6 2),(6 3),(6 2), (3 2) 共:12个 输入 共两行,第一行有一个正整数n,第二行有n个整数

重燃2020!!! 1万+

Notepad++ XML Tools插件:手把手教你格式化混乱XML与一键语法检查(保姆级教程)

本文详细介绍了如何使用Notepad++的XML Tools插件格式化混乱的XML文件并进行一键语法检查。通过插件安装、格式化实战和语法排错的完整流程,帮助开发者高效处理XML数据,提升API通信和数据存储的工作效率。特别适合需要快速验证和整理XML配置的开发人员。

weixin_42619742的博客 326

分治算法之求逆序对数

问题:有一实数序列a1,a2…an,若i

在路上coding的博客 1万+

海康工业相机LabVIEW二次开发实战——参数配置优化与图像高效存储

本文详细介绍了海康工业相机在LabVIEW平台上的二次开发实战,重点解析了相机参数配置的优化方法与图像高效存储策略。通过剖析曝光、增益、触发模式等核心参数的设置逻辑,并结合生产者-消费者设计模式,指导开发者构建稳定、高效的图像采集与异步存储流程,有效提升工业视觉项目的开发效率与系统稳定性。

weixin_29306317的博客 221

MOS管驱动电路设计全攻略

MOS管驱动电路设计全攻略

让你爱上电路设计 3634

寻找逆序对

设A[1...n]是一个包含n个不同数的数组。如果在i<j的情况下,有A[i]>A[j],则(i,j)就成为A中的一个逆序对(inversion)。 要确定一个数组中的逆序对的个数,可以采取分治法。将A分为两部分A1和A2,则A中逆序对的数目等于A1中逆序对的数目、A2中逆序对的数目和A1,A2合并时A1中比A2中元素大的数目。 参考代码: #include <iostre...

weixin_34072159的博客 241

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

本文介绍了医疗AI服务平台中多智能体资源争用问题的解决方案。作者设计了一个基于MCU(多点控制单元)理念的中央资源调度器,通过三层架构(资源抽象层、调度策略层、执行控制层)实现对GPU、API、数据库等医疗资源的统一管理。系统采用增强版信号量机制处理可计数并发资源,优化令牌桶算法管理速率资源,并支持急诊优先、配额限制、审计合规等医疗场景特殊需求。核心代码提供了带优先级抢占的并发控制和医疗专用令牌桶实现,可有效解决多智能体资源争用导致的优先级混乱、资源利用不均等问题。

AllenLV的博客 3219

合并排序

public class MergeSort { public static int[] mergeSort(int[] arr) { mergeSort(arr, 0, arr.length - 1); return arr; } public static void mergeSort(int[] arr, int p, int r) { //数组只剩下一个元素时为已排序数组 if (r != p) {

_ 275

RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络

本文记录的是利用颈部结构优化RT-DETR的目标检测网络模型。利用改进后的颈部网络,通过跳层连接,避免了在进行反向传播时的梯度消失问题,并且引入跨尺度连接,可以实现不同级别和层次的特征充分融合,获取足够的高层语义信息和低层空间信息交换,从而在大规模变化场景下提高检测性能。GIRAFFEDET: A HEAVY-NECK PARADIGM FOR OBJECT DETECTION-GFPN包含了上述的跳层连接(dense-link和log2nlog _{2} nlog2​n-link)以及跨尺度连接(Quee

Limiiiing的博客 2229

从 Material Requirements Planning 看 SAP 物料计划的底层控制逻辑

文章摘要:SAP中的MRP(物料需求计划)不仅仅是运行一个程序(如MD01N),其关键在于主数据和组织层级的正确配置。MRP的核心是解决"何时需要多少物料"的问题,涉及采购、生产、库存等多种供应来源。物料主数据的MRP视图必须在组织层级(如工厂、存储位置)下维护,不同层级的计划逻辑可能完全不同。S/4HANA更强调MRP Area作为细分计划单位,取代传统存储位置MRP。实施时需注意MRP Profile的合理使用,避免批量错误,并特别关注物料生命周期管理(如停用物料和替代件),这些因素共同决定了MRP能否

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1412

2018北大暑校acm算法训练课程 求排列的逆序数 树状数组/分治

总时间限制: 1000ms 内存限制: 65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。 对于不同的排名结果可以用逆序来评价它们之间的差异。考虑1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,满足 j &lt; k 且 ij &gt; ik, 那么就称(ij...

菜鸡的水题之路 374

如何通过Davinci Configurator来新增一个BswM仲裁规则

详细介绍如何通过Davinci Configurator来新增一个BswM仲裁规则。

initiallizer的博客 771

分治算法

Divide-and-Conquer算法的设计 设计过程分为三个阶段: Divide:整个问题划分为多个子问题 Conquer:求解各子问题(递归调用正设计的算法) Merge:合并子问题的解,形成原始问题的解 下面是几道小题使用分治算法求解的思路。 黑白点对 题目: 给定平面上有n个白点和n个黑点,任意三点不共线,试实际一个分治算法将每

❤Roxanne_33❤ 7569

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

分治递归逆序数_分治算法

Divide-and-Conquer算法的设计设计过程分为三个阶段:Divide:整个问题划分为多个子问题Conquer:求解各子问题(递归调用正设计的算法)Merge:合并子问题的解,形成原始问题的解下面是几道小题使用分治算法求解的思路。1黑白点对题目:给定平面上有n个白点和n个黑点,任意三点不共线,试实际一个分治算法将每个白点与一个黑点相连,是所有连线互不相交。思路:将所有2n个点点按照x有小...

weixin_32065293的博客 749

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

分治算法小结

分治即“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

qq_51165184的博客 672

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

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

《算法导论》读书笔记之排序算法—Merge Sort 归并排序算法

自从打ACM以来也算是用归并排序了好久,现在就写一篇博客来介绍一下这个算法吧 :)   图片来自维基百科,显示了完整的归并排序过程。例如数组{38, 27, 43, 3, 9, 82, 10}. 在算法导论讲分治算法一章的时候提到了归并排序。首先,归并排序是一个分治算法。 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表, 即把待排序序列分为若干个有...

weixin_30294021的博客 145

算法-分治

分治

m0_74333250的博客 1022

《程序设计与算法》之【分治算法】

分治的基本概念 归并排序 快速排序 例题 输出前m大的数 求排列的逆序数 分治的基本概念 把一个任务,分成形式和原任务相同,但规模更小的几个部分任务(通常是两个部分),分别完成,或只需要选一部完成。然后再处理完成后的这一个或几个部分的结果,实现整个任务的完成。 分治的生活实例–称假币 16枚硬币,有可能有1枚假币,假币比真币轻。有一架天平,用最少称量次数确定有没有假币,若有的...

beashaper_的博客 892

求解逆序数

求解逆序数 方法一:(直接求解法,时间复杂度为0(N^2)) #include #include using namespace std; #define MAX 10000 #define N 500 int a[N]; int nixu(int a[],int n) {   int i,j;   int count=0;   for(i=0;i   {

chenglinhust的专栏 1213

【分治算法 6】数组中的逆序对(hard)(每日一题)

分治算法(Divide and Conquer),顾名思义,将一个大问题分成多个小问题,然后分别解决这些小问题,最后将它们的解合并起来得到整体的解。这个算法的核心思想是将问题分割成更小的、相同结构的子问题,然后将子问题的解合并成原问题的解。 分治算法的运行流程通常包括三个步骤:分解、解决和合并。⽤归并排序求逆序数是很经典的⽅法,主要就是在归并排序的合并过程中统计出逆序对的数量,也就是在合并两个有序序列的过程中,能够快速求出逆序对的数量。 我们将这个问题分解成⼏个⼩问题,逐⼀破解这道题。

Y_1215的博客 697

实训三—分治算法专题—第9关:求排列的逆序数

头歌自创答案

xiyunSacire的博客 827

分治算法---求解逆序数问题

[实验目的] 基本掌握分治算法的原理. 掌握二路归并排序的算法及递归程序的设计. 【问题描述】 给定一个整数数组A=(a0,a1,…,an-1)。若 i<j 且 ai>aj,则<ai, aj>就是一个逆序对。例如数组(3,1,4,5,2)中,含有4个逆序对。编写一个程序,采用分治法中的二路归并排序算法,递归地求解A中的逆序对的个数,即逆序数。 【提示】采用分治法中的二路归并排序算法,对数组进行排序,在归并各个子序列时,统计逆序对的个数,如下图所示: 参考代码为.

weixin_51339377的博客 7343

计算数组逆序数(使用归并排序的分治思想)

分治思想 分解 解决子问题 合并 可以使用分治思想的问题有哪些特点: 原问题与分解成的子问题具有相同的模式 原问题分解成的子问题可以独立求解,子问题之间没有相关性 具有分解终止条件 可以将子问题合并成原问题,并且合并操作复杂度不能太高 以下以面向对象的方式实现归并排序相关功能: class Merge_sorter: def __init__(self): self...

肆拾柒分半 374

分治法之归并排序2-求解逆序数

public static void main(String[] args) { // TODO Auto-generated method stub //int aa[]={4,2,6,7,9,10,5,4,8,1}; int aa[]={4,2,6,7,9,1}; print(aa); System.out.println("inversion num: "+INV

ziyanguang1989的专栏 974

归并排序(MergeSort)和快速排序(QuickSort)的一些总结问题

归并排序(MergeSort)和快速排序(QuickSort)都是用了分治算法思想。 所谓分治算法,顾名思义,就是分而治之,就是将原问题分割成同等结构的子问题,之后将子问题逐一解决后,原问题也就得到了解决。 同时,归并排序(MergeSort)和快速排序(QuickSort)也代表了两类分治算法的思想。 对于归并排序,我们对于待处理序列怎么分的问题上并没有太多关注,仅仅是简单地一刀切,将整个...

weixin_30846599的博客 482
上一篇: motion estimation
下一篇: 编程之美-电梯调度算法
Fivesplus
博客等级 码龄12年 1粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值