分治法统计逆序数


逆序数:

对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。

那么给定了一个含n个不同自然数的排列,怎么计算出总共有多少对逆序数呢 ?

[Thought]

使用归并排序来求解,关键点在于归并子程序的时候计算逆序数对数。在进行归并时,需要对左右子序列进行比较,如果左边的数都小于右边的数,那么刚好是顺序的,就没有逆序数了。所以在每次进行比较时,一旦存在右边的数小于左边,则这个右数和左边所有的数都构成逆序数,则只需要在每次出现右边的数小于左边时,累加此时左边序列的长度。

[Note]

在编码的时候发现这个之前写过的小算法竟然还会写错,出现的问题是递归的结束条件没有判断好,造成了死循环!在归并的时候,如果序列数目小于等于1的时候都是要直接返回,但是因为下面的程序中为了节省数组构造时间,递归传递的是数组index,判断的时候就没写好了。

[Code]


Haiyang Xu 12 May 2014