算法:分治法
数据结构:数组
步骤:
(1)把数组从中间分为两段;
(2)递归调用此算法,分别处理前半段和后半段,分别得出前 半段和后半段的捣乱个数,并排序前半段和后半段;
(3)再计算前半段大于后半段的次数;
(4)三个结果相加,得出捣乱总数。
伪代码:
Count_inver(L)
{
If (只有一个元素) return 0;
Else {
Devide L into two lists, A, B;/*A :0~n/2, B: 1+n/2~n-1*/;
Ra = count_inver(A);
Rb = count_inver(B);
Rm = merge(A, B);
Return (Ra+Rb+Rm);
}
}
Merge的实现:
由于A,B已经升序排序完毕,可以这样计算出”AB之间”的的捣乱数目。仿照归并排序的merge过程,把AB归并为一个有序数组,供下一轮递归调用,在归并的过程中,每放入一个A元素,都统计这个元素大于B数组的个数,归并完毕后可得Rm。这个merge的过程可以在O(n)时间内完成。
算法复杂度分析:
T(n) = 2T(n/2)+O(n),得O(n*logn)
//你的例子4,3,5,2中,(4,3)(4,2)(3,2)(5,2)都是
//需要代码的话,给我消息。
温馨提示:内容为网友见解,仅供参考