XTU1167 逆序数

题目描述

给你一个序列x1,x2,…,xn,如果数对< xi,xj >,其中i< j,而xi> xj我们称之为逆序数对。一个序列的逆序数对的数目,称为这个序列的逆序数。比如说序列 3 1 2 ,逆序数对为 <3,1>和<3,2>,所以这个序列的逆序数为2。现在给你一个数字序列,请求其逆序数。 

输入
每个样例为两行,第一行为一个整数n(n≤10,000),表示序列中数字的个数,如果n为0,则表示输入结束,不需要处理。第二行是n个整数xi,0≤xi≤100,000。输入数据保证序列中没有相同整数。 
输出

每行输出一个整数,表示其序列数。 

样例输入
3
3 1 2
4
1 2 3 4
0
样例输出
2

0

解题思路

看到题目,第一反应是可以暴力解决,在读入整个序列后,顺序扫描,用两个循环实现逐个比较每一个数字与它后面数字的大小,若后面数字比它小,则构成一个逆序数对,逆序数加1。整个算法的时间复杂度是O(n^2).

更高效的解法是基于归并排序,时间复杂度是O(logn).参考剑指offer——数组中的逆序数对

下面贴出当时的暴力解法:

#include

const int N=10003;
int x[N];
int main(){
	int n;
	int sum;
	while(scanf("%d",&n)&&n){
		sum=0;
		for(int i=0;i


你可能感兴趣的:(XTU程序设计实践,逆序数,编程练习,程序设计)