分治 求 逆序數

2021-08-17 12:33:45 字數 795 閱讀 6892

利用歸併,

逆序數等於 左邊逆序數 + 右邊逆序數,加上 左邊 的每個數與右邊的每個數構成的逆序數。

歸併過程 把 左邊和右邊按照從小到大排序 在 merge過程中發現a[右邊] > a[左邊] 說明 在此左邊p1位置的右側的數都能與

此時的p2位置的 a[p2]構成逆序對。故 逐一對a[j]進行判斷,累加即可得到 最終逆序數。

m-p1+1表示 此時p1到中點m位置有多少個數(這些數都可以以a[p2]構成逆序對)

#includeusing namespace std;

int a[11];

int tmp[11];

int ans;

void merge(int a,int s,int m, int e, int tmp)//歸併 把每一小部分歸為有序

else

} while(p1 <= m)//把剩餘可能部分的加入歸併結果

tmp[pt++] = a[p1++];

while(p2 <= e)

tmp[pt++] = a[p2++];

for(int i = 0; i < e-s+1; ++i)

}void mergesort(int a,int s, int e,int tmp) }

int main()

mergesort(a,0,n-1,tmp);

printf("逆序數為: %d\n",ans);

for(int i = 0; i < n; ++i)

return 0;

}

分治求逆序數(CDQ)

歸併排序 includeusing namespace std int b 100 void merge sort int l,int r,int a else for int i l i r i a i b i int main merge sort 0,9,c for int i 0 i 10 ...

分治法求逆序數

include include include include using namespace std int arr2 100 在對序列進行二路歸併排序的時候,要將序列拆分成若干子串行,先將子串行排序,再合併子串行構成最終排序後的序列。二路歸併演算法還有乙個特點,在進行歸併操作時候的兩個子串行是有...

求逆序數的分治演算法

給我們乙個序列,讓我們求其逆序數 如3 2 1 4 逆序數為 2 1 0 0 3 我們這樣定義乙個序列的逆序數 序列a1 a2 a3 a2 an 這個序列的逆序數c,等於a1,a2.的逆序數的和.即 c sum ci ci為滿足ai aj j i 的數的總的個數,即ci sum ai aj j i ...