主要還是體現的分治思想,將資料先拆分n組在進行組合。
同時也得利用到遞迴回溯的思想
歸併排序和快速排序時間複雜度均為nlogn
上題第一題:(同快排一樣的題用歸併排序來寫)
給定你乙個長度為n的整數數列。
請你使用歸併排序對這個數列按照從小到大進行排序。
並將排好序的數列按順序輸出。
輸入格式
輸入共兩行,第一行包含整數 n。
第二行包含 n 個整數(所有整數均在1~109範圍內),表示整個數列。
輸出格式
輸出共一行,包含 n 個整數,表示排好序的數列。
資料範圍
1≤n≤100000
輸入樣例:
#include
using
namespace std;
const
int n =
1e6+10;
int q[n]
;int temp[n]
;int n;
void
merge_sort
(int q,
int l ,
int r)
while
(i <= mid) temp[k++
]= q[i++];
//**重要步驟**
while
(j <= r) temp[k++
]= q[j++];
for(
int i = l , j =
0; i <= r ; i++
, j++)//
}int
main()
merge_sort
(q,0
,n-1);
for(
int i =
0; i < n ; i++
)}
第二題:(運用歸併排序來解決其他類問題)-----逆序對的數量
給定乙個長度為n的整數數列,請你計算數列中的逆序對的數量。
逆序對的定義如下:對於數列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為乙個逆序對;否則不是。
輸入格式
第一行包含整數n,表示數列的長度。
第二行包含 n 個整數,表示整個數列。
輸出格式
輸出乙個整數,表示逆序對的個數。
資料範圍
1≤n≤100000
#include
using
namespace std;
const
int n =
1e6+10;
int q[n]
;int temp[n]
;int n;
long
long
int sum =0;
void
merge_sort
(int q,
int l ,
int r)
}while
(i <= mid) temp[k++
]= q[i++];
while
(j <= r) temp[k++
]= q[j++];
for(
int i = l , j =
0; i <= r ; i++
, j++)}
intmain()
merge_sort
(q,0
,n-1);
printf
("%lld"
,sum)
;}
排序演算法 3 歸併排序
這篇博文分為四個部分 歸併排序基本思想 基礎 實現與解析 一次優化 二次優化 自底向上的歸併排序 1.歸併排序基本思想 3 歸併排序 小到大排序 1.迴圈的將每乙個部分都分為原來的一半 直到最後每一部分只剩下乙個元素 2.迴圈的將每兩個部分進行合併並且排序 直到最後全部合併 o n log n 2....
歸併排序(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...