一、暴力遍歷法
最從前向後依次統計每個數字與它後面的數字是否能組成逆序數對。用到了雙循環,時間複雜度爲O(N^2)。
for (i = 0; i < len; i++){
for (j = i + 1; j < len; j++){
if (a[i] > a[j])
nCount++;
}
}
二、歸併排序法
比如合併數列(1,3,5)與(2,4)的時候:
1.先取出前面數列中的1。
2.然後取出後面數列中的2,那麼這個2和前面的3,5都可以組成逆序數對即3和2,5和2都是逆序數對。
3.然後取出前面數列中的3。
4.然後取出後面數列中的4,同理,可知這個4和前面數列中的5可以組成一個逆序數對。
這樣就完成了逆序數對的統計,歸併排序的時間複雜度是O(N * LogN),
while (i <= m && j <= n) //a[i] 前面的數 a[j] 後面的數
{
if (a[i] < a[j])
temp[k++] = a[i++];
else
{
temp[k++] = a[j++];
//a[j]和前面每一個數都能組成逆序數對
nCount += m - i + 1;
}
}