演算法筆記 歸併排序 逆序對 求逆序對

2021-09-17 18:13:03 字數 939 閱讀 2618

洛谷p1908 逆序對

wustoj 1850 求逆序對

題目描述:

1003: 求逆序對

給定乙個序列a1,a2,…,an,如果存在iaj,那麼我們稱之為逆序對,求逆序對的數目。

input

第一行為n,表示序列長度,接下來的一行包含n個整數(a1,a2,…,an),表示序列中的n個數。

n<=105,ai<=1055,ai<=105

output

輸出所有逆序對總數。

sample input

43 2 3 2

sample output

3思路:歸併排序

其排序原理我也就不多說了,網上也是爛大街的**和講解,不清楚的可以去網上找找看。而逆序對求解過程可以在歸併排序中進行。即:對於左:l —— m和右:m+1 —— r兩個子區間,每次肯定都是各自已經排好序了的,剩餘任務就是將兩個區間整合。而在整合時,若右區間某元素y與左區間某元素x成逆序對,則y與x左側所有元素都成逆序對,加上x及x左側所有元素即可。

由於洛谷資料要求比wustoj大,故此處直接上洛谷**吧(總之兩個都能ac就是了)。

#include

#include

int n,a[

500010

],t[

500010];

long

long tot=0;

void

msort

(int l,

int r)

//對a在x,y 下標範圍的元素進行歸併排序求解逆序對

//如果是的話,則該數即該數左側的所有元素都與這個數成逆序對

}for

(i=l;i<=r;i++

) a[i]

=t[i];}

intmain()

return0;

}

歸併排序求逆序對

排序都用qsort了,別的排序演算法不怎麼用,但有些排序的思想很重要。碰到一道求逆序對的題,要用到歸併排序,學習了一下歸併排序。歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟 分解 將n個元素分成個含n 2個元素的子串行。解決 用合併排序法對兩個子串行遞迴的排序。合併 合併兩個已排序的子串行...

歸併排序求逆序對

我們知道,求逆序對最典型的方法就是樹狀陣列,但是還有一種方法就是merge sort 即歸併排序。實際上歸併排序的交換次數就是這個陣列的逆序對個數,為什麼呢?我們可以這樣考慮 歸併排序是將數列a l,h 分成兩半a l,mid 和a mid 1,h 分別進行歸併排序,然後再將這兩半合併起來。在合併的...

歸併排序求逆序對

現在給定乙個有n個數的數列ai。若對於i j,有ai aj,則稱 i,j 為數列的乙個逆序對。例如,2,3,8,6,1 有五個逆序對,分別是 1,5 2,5 3,4 3,5 4,5 現在請你求出乙個給定數列的逆序對個數。輸入格式 乙個整數t,表示有多少組測試資料。每組測試資料第一行是乙個正整數n 1...