歸併排序 C C (簡單理解)

2021-10-14 18:23:25 字數 1828 閱讀 7036

此文一方面為主觀理解歸併排序,若有地方不妥,還請見諒。

歸併排序是建立在歸併操作上的一種有效,穩定的排序演算法,該演算法是採用分治法(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...

歸併排序理解遞迴

點開之後可以看到歸併排序的動態演示圖,只要能理解這個圖,就能夠理解遞迴和歸併排序了。你可以看到圖裡面的數分了四層,然後變成八個數,但是每兩個數是乙個遞迴裡面的,所以先從第乙個和第二個數開始歸併,歸併的時候比較大小,歸併完之後,這是這個小遞迴的結束,然後這層總共有四個小遞迴,依次執行完即可。然後才是第...