逆序数求解

来源:互联网 发布:windows桌面软件 编辑:程序博客网 时间:2024/06/09 16:53

问题描述:

对于n个数的一个排列排,A1,A2,……,Ak ,Aj,……An.

如果存在k<j,Ak> Aj ,则称有一个逆序对存在,如  2 6 3 4 5 1,则有逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),逆序数为8.

设计算法,对给定排序求解逆序数。

设计思想:

用二分法求解,将A分为两部分,AL和AH。分别求解两个的逆序数,然后将两者归并成一个递增的数组,即归并后的逆序数为0。逆序的产生就发生在归并的过程中,这个归并过程和二分法的归并过程相似,各用一个下标从前往后扫,每次归入一个,归并后是一个升序数组。

在归并过程中:

       L[i]<R[j],将L[i]放入合并的数组,N]+=0;

       L[i]>R[j],将R[j]拿走,从L[i]到L[k]都为逆序数,N+= k-i+1;

伪码:

算法ReversePair(A,n)

输入:A的一个排序

输出:A中的逆序数

明天再写