分治2——求排列的逆序数

3人阅读 评论(0) 收藏 举报
分类:
最笨的方法时间复杂度为O(n2),采用利用二分归并排序算法思想,时间复杂度为O(nlogn)
#include<iostream>

using namespace std;
int a[1000], temp[1000];
long long sum = 0;

void merge(int a[], int s, int m, int e, int temp[])
{
	int pb = 0;
	int p1 = s, p2 = m + 1;
	while (p1 <= m && p2 <= e)
	{
		if (a[p1] < a[p2])
			temp[pb++] = a[p1++];
		else
		{
			temp[pb++] = a[p2++];
			sum += (m - p1 + 1);  // 关键点
		}
	}
	while (p1 <= m)
		temp[pb++] = a[p1++];
	while (p2 <= e)
		temp[pb++] = a[p2++];
	for (int i = 0; i < e - s + 1; i++)
		a[s + i] = temp[i];
}
void mergeSortCount(int a[], int s, int e, int temp[])
{
	if (s < e)
	{
		int m = s + (e - s) / 2;
		mergeSortCount(a, s, m, temp);
		mergeSortCount(a, m + 1, e, temp);
		merge(a, s, m, e, temp);
	}
}
void main()
{
	int n;
	cin >> n;
	for (int i = 0; i < n; i++)
		cin >> a[i];
	mergeSortCount(a, 0, n - 1, temp);
	/*for (int i = 0; i < n; i++)
		cout << a[i] << ' ';
	cout << endl;*/
	cout << sum << endl;
	system("pause");
}

查看评论

任意位置显示html菜单

脚本说明:把如下代码加入区域中document.onclick = popUp   function popUp() {newX = window.event.x + document.body.sc...
  • denal
  • denal
  • 2003-03-10 10:21:00
  • 866

分治法求解逆序数

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。       求逆序数的方法很多。最容易想到的办法是...
  • dy01dy
  • dy01dy
  • 2014-07-25 11:49:14
  • 1295

使用分治法计算逆序数——算法

/*----------------------------------------------- 名称:Use divide-and-couquer count the inversion 分治...
  • u013589337
  • u013589337
  • 2014-10-25 22:06:57
  • 2295

求逆序数之分治排序

求逆序数 时间限制:2000 ms | 内存限制:65535 KB 难度:5 描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排...
  • smallacmer
  • smallacmer
  • 2012-02-17 08:42:53
  • 694

NOI2.4基本算法之分治 求排列的逆序数 分析----也是醉了...

刚开始写博客,请大家多提意见 一、题目描述 总时间限制: 1000ms 内存限制: 65536kB 描述 在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对...
  • C20180602_csq
  • C20180602_csq
  • 2016-08-18 11:18:35
  • 1432

算法思想学习系列:分治法——求数列的逆序数

申明:全文参考巫泽俊《挑战程序设计》 算法思想:分治法,通过将问题划分为规模更小的子问题,递归地解决划分后的子问题,再将结果合并从而高效地解决问题 座右铭:越努力越幸运...
  • Earl211
  • Earl211
  • 2017-03-17 11:20:42
  • 437

求排列的逆序数(分治)

一个排列含有逆序的个数称为这个排列的逆序数。例如排列263451含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。 ...
  • Zhanyeye749
  • Zhanyeye749
  • 2018-02-06 20:11:17
  • 38

分治法求一个N个元素数组的逆序数

转自:http://www.cnblogs.com/ChrisLi/p/3798858.html 分治法求一个N个元素数组的逆序数 背景      逆序数:也就是说,对于n个不同...
  • qq_26525317
  • qq_26525317
  • 2017-05-05 19:06:50
  • 270

归并排序-求逆序数算法

归并排序一直以为比较简单,不算特别重视,今天试着写了一下,很尴尬,失败了几次.最后还是决定写博记录一下.废话不多说,直接进正题. 算法:归并排序是分治法(分而治之)的一种典型应用,应用递归的思想,自顶...
  • leolinsheng
  • leolinsheng
  • 2013-08-01 00:56:15
  • 3130

排列逆序数和计算

一. 排列的逆序与逆序数 逆序: 取一个排列为标准排列, 其它排列中某两个元素的次序与标准排列中这两个元素的次序相反时,则称这两个元素构成一个逆序. 逆序数: 一个排列中所有逆序总数叫做这个排列的逆序...
  • cay22
  • cay22
  • 2014-12-13 18:01:20
  • 1148
    个人资料
    等级:
    访问量: 560
    积分: 77
    排名: 155万+
    文章存档