基礎演算法分治演算法之1237 求排列的逆序數

2021-10-05 18:58:08 字數 874 閱讀 4305

逆序數:乙個數列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,那麼我們稱之為逆序對,求逆序對的數目。解析 這道題 只要雙重迴圈就可以解決 但是因為題目要求 所以被迫使用更麻煩的方法 這道題其實就是歸併排序 至於為何 就不說了 歸併排序 就是將乙個陣列 不斷分割 一直分割到只剩乙個為止 乙個的話 必定是有序的 ...