归并求逆序对【模板】

简介:

代码:

#include <stdio.h>

const int M=999999;

int A[500];
int cunt=0;
int L[250],R[250];

void Merge(int Left,int Middle,int Right)
{
	int n1=Middle-Left+1;
	int n2=Right-Middle;

	for(int i=1;i<=n1;i++)
		L[i]=A[Left+i-1];
	for(i=1;i<=n2;i++)
		R[i]=A[Middle+i];

	L[n1+1]=M;
	R[n2+1]=M;

	i=1;
	int j=1;
	for(int k=Left;k<=Right;k++)
	{
		if(L[i]<=R[j])
			A[k]=L[i++];

		else
		{
			A[k]=R[j++];
			cunt+=n1-i+1;                 //cunt为全局变量
		}
	}
}

void Merge_sort(int Left,int Right)
{
	int Middle;
	if(Left<Right)
	{
		Middle=(Left+Right)/2; 
		Merge_sort(Left,Middle);                      // 二分分解左部分
		Merge_sort(Middle+1,Right);                // 二分分解有部分
		Merge(Left,Middle,Right);                      //合并两部分
	}
}

int main()
{
	int n;
	scanf("%d",&n);

	int i;
	for(i=1;i<=n;i++)
		scanf("%d",&A[i]);

	Merge_sort(1,n);

	printf("%d\n",cunt);

	return 0;
}


运行结果:

5
2 3 8 6 1

5

相关文章
|
9月前
|
算法 测试技术 C++
【动态规划】【离线查询】【前缀和】689. 三个无重叠子数组的最大和
【动态规划】【离线查询】【前缀和】689. 三个无重叠子数组的最大和
|
7月前
|
算法
二分 模板
二分的另一个板子
51 1
|
9月前
|
机器学习/深度学习 算法 测试技术
【状态压缩 并集查找 图论】2157. 字符串分组
【状态压缩 并集查找 图论】2157. 字符串分组
|
9月前
|
Python
{二分模板}
{二分模板}
35 0
|
9月前
|
算法 JavaScript 前端开发
贪心算法】按要求补齐数组
贪心算法】按要求补齐数组
30 0
|
9月前
|
存储 搜索推荐 算法
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(一)
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(一)
|
9月前
|
存储 搜索推荐 算法
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(二)
排序 | 冒泡 插入 希尔 选择 堆 快排 归并 非递归 计数 基数 排序(二)
|
C语言
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
【C语言刷题】调整奇数偶数顺序、有序序列合并以及有序序列判断
80 0
算法:分治思想处理快排递归以及快速选择/最小K个数问题
算法:分治思想处理快排递归以及快速选择/最小K个数问题
|
机器学习/深度学习 人工智能 搜索推荐
P1177 【模板】快速排序(二分排序)
P1177 【模板】快速排序(二分排序)
92 0