求逆序對數總結 歸併排序

2021-09-08 22:40:32 字數 940 閱讀 9748

用歸併排序方式

最原始的方法的複雜度是o(n^2)。

使用歸併排序的方式,可以把複雜度降低到o(nlgn).

設a[1..n]是乙個包含n個非負整數的陣列。如果在i〈 j的情況下,有a〉a[j],則(i,j)就稱為a中的乙個逆序對。

例如,陣列(3,1,4,5,2)的「逆序對」有<3,1>,<3,2><4,2><5,2>,共4個。

注:我覺得方法是在歸併過程中,記錄每次歸併,後面的分組中被放到了前面的元素的個數。

的確是這樣的。下面這個也是mergesort的基本演算法框架:

int gcount = 0

; template

intmerge(iterator begin, iterator mid, iterator end)

else

}if(il ==mid) copy(ir, end, it);

if(ir ==end) copy(il, mid, it);

copy(v.begin(), v.end(), begin);

return0;

}template

intmergesort(iterator begin, iterator end)

step = count / 2

; mergesort(begin, begin +step);

mergesort(begin +step, end);

merge(begin, begin +step, end);

return0;

}

重點在 gcount += distance(il, mid) (注:distance其實就是位置的減法)

逆序對數實質就是插入排序過程中要移動元素的次數。

要移動的元素的位數即第乙個序列中還未插入到新序列中的元素的個數

即: distance(il, mid)

歸併排序求逆序對數

參考部落格 歸併排序求逆序對數 include include include includeusing namespace std 歸併排序是借助乙個輔助陣列來進行排序 int ans 0 void merge sort int a,int l,int r,int t a是原陣列,t是輔助陣列 i...

歸併排序及利用歸併排序求逆序對數

include include include include include using namespace std 用歸併排序順便完成統計逆序對數。因為合併操作是從小到大進行的,當右邊的a q 複製到t中時,左邊還沒來得及複製到t中的那些數就是左邊所有比a q 大的數。此時在累加器中加上左邊的元...

演算法1 求逆序對數與顯著逆序對數(歸併排序)

求逆序對數問題是歸併排序的基礎問題,顯著逆序對數則是逆序對數的公升級版。poj2299,poj1804均是此類問題 但是個別細節不同,例如poj2299需要將逆序對數變數num設為long long int型 一 求逆序對數 描述 對於乙個長度為n的整數序列a,滿足i j 且 ai aj的數對 i,...