資料結構 向量 歸併排序

2021-07-08 14:16:04 字數 1267 閱讀 1887

好了,我們現在來看一下歸併排序。

1.歸併排序原理

2.**實現

3.在向量模板中實現

4.總體評價

歸併排序利用分而治之的策略,將陣列從中分割成兩個小陣列,兩個小陣列再以相同的方式分割,一直這樣遞迴分割,直至數值元素個數為1,無法再分為止。讓後再合併有序子串行(1個元素的序列也是有序序列,合併後的序列也要為有序的),最終會得到乙個有序的數列,即我們所要的數列。可向下面這樣解釋:

2.**實現:

#includeusing namespace std;

void merge(int *a,int lo,int mi,int hi)//二路歸併

首先k>lc與b[j]<=c[k]的位置不能調換,因為"||"語句是先判斷前面是否正確,如果正確則不會在執行後面的語句,直接返回true。如果k已經滿足k>=lc,則c[k]已經越界,但是由於b[j]<=c[k]在k>=lc後面,所以不會執行,程式還是安全的。但如果將它放在前面,則有能在k>=lc的情況下執行,造成陣列越界,程式是不安全的。還有要注意b[j]<=c[k]的「=」號是不能省的。如果省掉,則當b[j]==c[k]時,程式將進入死迴圈。

我們在來看一下merge函式是怎麼執行的。merge的作用是將兩個有序的數列合併成乙個有序的數列。我們採用的是二路歸併的演算法,其原理如下圖:

每次都是從兩個有序數列中取出最小的那個值,放在新的數列的後面。直到全部放完為止。這樣新的數列就是有序的了。

templatevoid myvector::merge(rank lo,rank mi,rank hi)

rank mi=(lo+hi)/2;//以中點為界

mergesort(lo,mi);//對前半段排序

mergesort(mi,hi);//對後半段排序

merge(lo,mi,hi);//歸併

}

歸併演算法的複雜度為o(nlogn),這是很不錯的了。它的穩定性較好,且可擴充套件性極佳,就是用的空間多了點而已。

想要學習更多關於向量的知識,!!

資料結構 歸併排序

排序 sort 或分類 內部排序方法可以分為五類 插入排序 選擇排序 交換排序 歸併排序和分配排序。歸併排序 include using namespace std 歸併排序中的合併演算法 void merge int a,int left,int center,int len int t int ...

資料結構 歸併排序

歸併排序,即merge sort,通過遞迴式的merge操作 merge即歸併 實現排序。演算法思想是分治思想 divide and conquer 歸併排序一般是遞迴實現的 時間複雜度o nlgn 遞迴都是一去一回,去的時候divide,回的時候conquer。表達欠提煉 1 divide,分 遞...

資料結構 歸併排序!!!

歸併排序 整體思想 將資料分成很多的部分,每次排序資料的一部分,然後將兩部分的資料進行整體排序,這樣一步一步將整體資料排序。如圖 注 將需要排序的資料進行分塊,當每個塊的資料足夠的少的時候就可以進行效率高的排序方法,當兩塊資料排序好的時候就可以將兩塊排序好的資料進行合併。具體實現方法 ifndef ...