歸併排序,採用的是分治的思想,例如:
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)
輸出逆序數
42431
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 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。歸併 將兩個已經排好序的集合合併到乙個集合眾,並且保證新的集合也是有序的。核心點 只有乙個元素的集合是已經排好序的集合。歸併排序是建立在...