資料結構C 演算法實現3 歸併排序2

2021-08-27 15:02:24 字數 2092 閱讀 9107

這次是按照 introduction to algorithm 的歸併排序來寫的c++實現演算法,其中復用了前面用過的合併兩個陣列的演算法。

stl函式:for_each(veci1.begin(), veci1.end(), print());

這次用了for_each這個stl中的標準函式,代替了前面自己寫的for_all函式,用法也很簡單,前面兩個引數是陣列的範圍,第三個引數可以是函式也可以是函式物件,就是實現用這個函式操作每乙個陣列的元素。

我發現introduction to algorithm這本書雖然經典,但是它也沒有很好的處理下標問題,所以我在程式設計的時候也不能直接抄它的下標,必須要自己認真核對,它處理的下標應該是有錯的,下面我也標誌處錯處了。下面是c++**,注發布了書本上的偽**,比較一下吧:

包括了乙個標頭檔案,就是這裡的乙個演算法:

#pragma once

/*****

merge.h

已知兩線性表中的資料元素按值非遞減排列,歸併兩線性表到新的線性表,是的資料元素也按值非遞減排列

*****/

#include#includeusing namespace std;

templatevoid mergelist(vector&t, vector&t1, vector&t2)

else

}while(iter1!=t1.end())

while(iter2!=t2.end())

}

下面是主檔案**:

#include#include#include#include"merge.h"

using namespace std;

templatevoid mymerge(vector&t, int p, int q, int r)

}/* introduction to algorithm 中的演算法

merge(a, p, q, r)

1 n1 = q - p + 1

2 n2 = r - q //這裡的下表按照c++的思維習慣的話,應該是不對的,應該是n2=r-q+1

3 letl[1.. n1 + 1] and r[1.. n2 + 1] be new arrays

4 for i = 1 to n1

5 l[i] = a[p + i - 1]//這裡是正確的

6 for j = 1 to n2

7 r[j] = a[q + j ] //這裡也應該不對,改為:a[q+j-1]

8 l[n1 + 1] = 無窮大//其實下面就是mergelist的演算法,不過有點不一樣罷了,效果一樣

9 r[n2 + 1] = 無窮大

10 i = 1

11 j = 1

12 for k = p to r

13 if l[i] <= r[j]

14 a[k] = l[i]

15 i = i + 1

16 else a[k] = r[j]

17 j = j + 1

*/templatevoid mergesort(vector& t, int p, int r)

//下表從0開始,比較符合c/c++的程式設計習慣

templatevoid mergesort(vector&t)

templateclass print

void inline operator()(const t& x) const;

vectorveci2(b,b+7);

mergesort(veci2, 1, 7);

for(auto x:veci2)

{//c++11標準遍歷陣列,非常方便

cout<());

cout《本演算法一直都覺得很難理解的,因為遞迴本來就難理解,而且還拆分那麼對次,很難跟蹤他的思路的,尤其是嚴蔚敏等一大批書關於這個演算法的程式都按照乙個思路來寫的,非常糟糕。

introduction to algorithm這本書就簡化了引數,好理解很多了,傳入的陣列引數只有乙個,非常簡明。

還有值得注意的就是下標問題,非常頭疼的問題,所以寫程式的時候要非常注意。一定要乙個乙個下標跟蹤好,否則很容易下標溢位。

值得思考一下怎麼把這個程式的下標進一步規範一下吧。

資料結構C 實現歸併排序

本來寫了一大堆,一貼上 都沒了,不想寫了,直接來 include include include using namespace std void merge vector int nums,int start,int mid,int end,vector int temp else while l...

資料結構與演算法 C 實現歸併排序

歸併排序 思想 將兩個有序陣列歸併成乙個更大的陣列。優點 保證任意長度為 n的陣列,排序需要所需時間與nlogn成正比。缺點 所需的額外空間與n成正比 includeusing namespace std int temp 100 void merge int a,int from,int mid,...

資料結構(3)歸併排序

歸併排序 merging sort 就是利用歸併的思想實現的排序方法。它的原理是假設初始序列含有n個記錄,則可以看成是n個有序的子串行,每個子串行的長度為1,然後兩兩歸併,得到 n 2 個長度為2或1的有序子串行,再兩兩歸併,直至得到乙個長度為n的有序序列為止,這種排序方法成為2路歸併排序。pack...