歸併排序加例題

2021-08-17 05:09:22 字數 1269 閱讀 1230

歸併排序,採用的是分治的思想,例如:

0 4 2 1 3

這個陣列,先分成兩部分

0 4 和 2 1 3

再分成兩部分

0  和  4  和  2   和  13

最後則0 和 4 和 2 和 1 和  3

然後, 建立新陣列

0 和 4,0小於4

則新陣列為0 4

同理可得  1  3

則可得0 4 和 2 和 1 3

再建立新陣列,對比0  4 和 2

顯然,0 小於2,新陣列0

再對比4 和2,2 小於4,則新陣列0 2

最後剩下個4,則新陣列0 2 4

再對比0 2 4 和 1 3 

原理同上,最後得到

0 1 2 3 4

給一道求逆序的例題,利用的便是歸併排序的原理,第一次個人排位賽沒a出來,因為還沒學歸併排序(「萬惡」的stl太方便了)

冬瓜發現期末很多人都掛了線代,他決定寫個程式幫掛科的同學。在乙個排列中,如果一對數的前後位置與大小

順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。

可是冬瓜想的頭髮都掉光了,聰明的你肯定能夠幫幫他。

輸入有多組

第1行:n,n為序列的長度(n <= 50000)

第2 - n + 1行:序列中的元素(0 <= a[i] <= 10^9)

輸出逆序數

424

31

4

附上ac**:

#include#define ll long long

using namespace std;

int temp[55555];

ll ans = 0;

void unio(int l1,int s1,int l2,int s2)

else

temp[k++] = l1[i++];

}while(i < s1)

temp[k++] = l1[i++];

while(j < s2)

temp[k++] = l2[j++];

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

l1[i] = temp[i];

}void divi(int l,int s)

}int main()

return 0;

}

歸併排序(2 路歸併排序)

遞迴寫法 include define maxn 100 void merge int a,int l1,int r1,int l2,int r2 將陣列a的區間 l1,r1 和區間 l2,r2 合併為乙個有序區間 else while i r1 while j r2 for int i 0 i非遞...

python歸併排序 python 歸併排序

排序思路 1.將陣列分成兩組a,b,建立臨時陣列 c,c長度 a b 2.i,j分別屬於a,b 3.若a i b j 將b j 放入c,j 否則 a i 放入c,i 4.迴圈3步驟,將a或b中剩餘的元素放入c,再將c複製到陣列中 5.遞迴3 4直到a,b序列的長度 1 歸併排序 class merg...

排序 歸併排序

歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...