速度僅次於快速排序,而且排序穩定的就是你了--歸併排序,不過實現起來比快排要略複雜。
歸併排序,其的基本思路就是將陣列分成二組a,b,如果這二組組內的資料都是有序的,那麼就可以很方便的將這二組資料進行排序。
為了讓二組有序,可以將a,b組各自再分成二組。依次類推,當分出來的小組只有乙個資料時,可以認為這個小組組內已經達到了有序,然後再合併相鄰的二個小組就可以了。這樣通過先遞迴的分解數列,再合併數列就完成了歸併排序。
為了方便當做模板套用,我把if和while迴圈後面都加了大括號
**如下:
//本次編寫的為按從大到小的順序
#include #include
using
namespace
std;
int a[1000],temp[1000];//
大小自己根據題目要求來改
void mergearray(int a,int temp,int first,int mid,int
last)
else
}while(i<=mm)
while(j<=nn)
//接下來別忘記了起始點是first
for(int i=0;i//
再把中間陣列的值賦回原陣列
}void mergesort(int a,int first,int last,int
temp)
}int
main()
mergesort(a,
0,n-1
,temp);
for(int i=0;i)
cout
<}
排序演算法 2 歸併排序
歸併排序使用了分治的思想,即將乙個陣列的排序分解為兩個子陣列 首先分解為規模更小的子問題 然後對這兩個子陣列分別排序 分而治之 最後對兩個已排序的子陣列進行合併 合併子問題結果 關鍵在於,合併操作只需要o n 的時間複雜度,那麼根據master定理,歸併排序的整體時間複雜度為o lg n 從漸進時間...
排序演算法(2) 歸併排序,快速排序
分治思想 思想 將兩個有序的陣列歸併成乙個有序陣列。下面兩種歸併方法用到 建立乙個適當大小的陣列,然後將兩個有序陣列乙個個有序的放入所建立的陣列中 在此造成了額外的空間儲存問題 方法簽名 merge array,lo,hi 將子陣列a lo.mid a mid 1.hi 歸併,並將結果放入大a lo...
排序演算法(2) 歸併排序 快速排序
穩定原地排序 時間複雜度 空間複雜度 歸併排序 o n logn o n 快速排序 o n logn 歸併排序的合併函式,在合併兩個有序陣列為乙個有序的時,需要借助額外的儲存空間 public class mergesort private static void mergesortinternal...