总时间限制:
500ms
内存限制:
65536kB
描述
对于一个长度为N的整数序列A,满足i < j 且 Ai > Aj.的数对(i,j)称为整数序列A的一个逆序
请求出整数序列A的所有逆序对个数
输入
输入包含多组测试数据,每组测试数据有两行
第一行为整数N(1 <= N <= 20000),当输入0时结束
第二行为N个整数,表示长为N的整数序列
输出
每组数据对应一行,输出逆序对的个数
样例输入
5 1 2 3 4 5 5 5 4 3 2 1 1 1 0
样例输出
0 10 0
解题思路详解:
主要用到的算法是归并排序的算法,递归。在归并排序的过程中,通过合并两个小段就能统计出逆序对的个数。例如:1,2,3;1,4;合并,程序流程如下:
1. 初始时刻,pos1=0,pos2=0;都指向两个数组的第一个数,定义一个长度为5的数组temp[5],因为两个数组一共5个数。
2. 1=1;pos1++;temp[0]=1;
3. 2>1; pos2++; temp[1]=1; 这个时候选择了第二个数组的第一个数,且第一个数组有剩余值,说明这些剩余值都将与第二个数组 的第一个数是逆序的,找到2个逆序对。
4. 2<4; pos1++;temp[2]=2;
5. 3<4; pos1++;temp[3]=3;
6