逆序數:乙個數列nums[n],對任意兩個數,如果前面的數大於後面的數,那麼就稱它們為一對逆序數。逆序數越大的排列與原始排列的差異度就越大。
現給定1,2,…,n1,2,…,n的乙個排列,求它的逆序數。
第一行是乙個整數nn,表示該排列有nn個數(n≤100000n≤100000)。
第二行是nn個不同的正整數,之間以空格隔開,表示該排列。
輸出該排列的逆序數。
#include
using
namespace std;
long
long temp[
100001
],a[
100001
],tot=0;
void
merge_sort
(int l,
int r)
//可計逆序數的排序
else
temp[p++
]=a[i++];
}//左右兩側處理後會有一側含有較大的剩餘部分直接加入到尾部
while
(i<=mid)temp[p++
]=a[i++];
while
(j<=r)temp[p++
]=a[j++];
for(i=l;i<=r;i++
) a[i]
=temp[i]
;//全部轉入原陣列
}int
main()
分治演算法的核心體現在將大問題細分為相似的小問題,通過相同的解決方法彙總,最終解決大問題;
如果發現計算超過計算時間,可以將流輸入輸出cin和cout換成格式化輸入輸出scanf,printf,因為格式化輸入輸出,更適合大資料處理。
演算法基礎 分治
分治就是將問題的乙個例項劃分為兩個或更多個較小的例項 這些較小的例項通常也是原問題的例項 一直持續劃分例項,直至問題規模小到可以輕鬆獲得答案為止。實際上這也可以說是一種遞迴的思想。在包含size個元素的 從小到大排序的int陣列a裡查詢元素p,如果找到,則返回元素下標,如果找不到,則返回 1。二分查...
演算法 分治演算法(以快排為例)
將大問題轉化成小問題,用遞迴的策略來解決問題 1.快速排序 基本思想 選乙個元素作為基準,將小於和大於該元素的值分別進行排序,最後,將小於該元素的那部分值,該元素,大於該元素的那部分值,合併,就是最終的結果。完整 快排遞迴演算法 include using namespace std vector ...
分治演算法 求逆序對
題目 給定乙個序列a1,a2,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。解析 這道題 只要雙重迴圈就可以解決 但是因為題目要求 所以被迫使用更麻煩的方法 這道題其實就是歸併排序 至於為何 就不說了 歸併排序 就是將乙個陣列 不斷分割 一直分割到只剩乙個為止 乙個的話 必定是有序的 ...