此文一方面為主觀理解歸併排序,若有地方不妥,還請見諒。
歸併排序是建立在歸併操作上的一種有效,穩定的排序演算法,該演算法是採用分治法(divide and conquer)的乙個非常典型的應用。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序相當於將一組資料拆分為幾組資料;
例如將a[6]=,可以拆分為a1[2]=, a2[2]=, a3[2]=;
(此處省去了拆分單個情況)
利用a1~a3這幾組分別排序,再一次合併排序,
即a1與a2合併為a4[4]=;
再將a4與a2合併,即為最終序列。
與氣泡排序相比:將陣列拆分為多個子集氣泡排序需要在外迴圈遍歷整個陣列需要 n次,在內迴圈裡需要比較每個相鄰的數,需要比較(n-1)!次。總共時間複雜度為o(n^2)···此處略去求複雜度
歸併排序一共需要進行logn層,(相當於是乙個遞迴樹),每一層的時間複雜度為n』,因此時間複雜度為(n』)*logn,即o(nlogn);
void
cut_sort
(int begin,
int end)
}
對每個子集進行比較,此次需要乙個temp陣列來臨時儲存已排序的陣列
void
react
(int begin,
int mid,
int end)
}while
(i<=mid) temp[k++
]=a[i++];
while
(j<=end) temp[k++
]=a[j++];
for(i=begin;i<=end;i++
) a[i]
=temp[i]
;}
源**為
#include
#include
#include
#include
#include
#include
#include
#define ll long long
using
namespace std;
int a[
500000
],temp[
500000];
void
cut_sort
(int begin,
int end)
;void
react
(int begin,
int mid,
int end)
;int
main()
void
cut_sort
(int begin,
int end)
}void
react
(int begin,
int mid,
int end)
}while
(i<=mid) temp[k++
]=a[i++];
while
(j<=end) temp[k++
]=a[j++];
for(i=begin;i<=end;i++
) a[i]
=temp[i]
;}
歸併排序 c c
歸併排序的優點是穩定,時間複雜度與nlgn成正比,缺點是所佔空間與n成正比.自頂向下的歸併排序 對乙個陣列進行歸併排序,可將乙個陣列分成兩個,先使得子陣列有序,然後再將兩個有序的子陣列合成乙個有序的子陣列,即將陣列的排序轉化為對兩個有序陣列的合併.對於乙個無序的陣列來說,先遞迴操作是最小的子陣列有序...
C C 實現歸併排序
將乙個陣列的左半部分先排好序,然後再將右半部分排好序 然後通過外排的方式將左右兩個部分整體排好序 外排,即額外使用乙個輔助陣列,使整體有序 堆排序氣泡排序 選擇排序 插入排序 隨機快速排序 一維隨機數組生成器 歸併排序 實現外排 template class t void merge t arr,i...
歸併排序理解遞迴
點開之後可以看到歸併排序的動態演示圖,只要能理解這個圖,就能夠理解遞迴和歸併排序了。你可以看到圖裡面的數分了四層,然後變成八個數,但是每兩個數是乙個遞迴裡面的,所以先從第乙個和第二個數開始歸併,歸併的時候比較大小,歸併完之後,這是這個小遞迴的結束,然後這層總共有四個小遞迴,依次執行完即可。然後才是第...