給定乙個數列,求數列的逆序數對總個數(逆序數對就是指數列中的兩個數,排在前面的數比排在後面的數大,這樣就構成了乙個逆序數對)。
例如: 4 2 1 3
這個數列的逆序數對有: (4, 2);(4, 1);(4, 3);(2, 1);總共有4個逆序數對。
ps:其實完全是使用了歸併排序的思想,只是在合併的時候多加了一句統計該範圍內的逆序數的個數,我們累加每乙個小區間的逆序數個數,自然就得到了整個數列的逆序數對總個數。
參考**:
#include
int arr = ;
int tmp[100];
int ninversecount = 0;//儲存逆序數對個數
void merge(int s, int m, int t)
}while (i <= m)
tmp[k++] = arr[i++];
while (j <= t)
tmp[k++] = arr[j++];
}void mergesoft(int s, int t)
}int main()
執行結果:
求數列的逆序數
在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。123 4567 891011 1213 1415 1617 1819 2021 2223 2425 2627 28ll a 500005 tem 50000...
從歸併排序到數列的逆序數對
首先來看看原題 微軟2010年筆試題 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序數對。乙個排列中逆序的總數就稱為這個排列的逆序數。如中,2和1,4和3,4和1,3和1是逆序數對,因此整個陣列的逆序數對個數為4,現在給定一陣列,要求統計出該陣列的逆...
輸出乙個數列的逆序數
1,這個問題演算法導論講歸併排序時,提到過。找到乙個實現 思路還是蠻清晰的。核心 對於兩個有序序列,找逆序對,遍歷一次即可。2,實現 include include using namespace std int inv int data,int n ret j tmp i j data i 不是逆...