自學筆記之歸併排序

2021-06-27 06:45:33 字數 1230 閱讀 6953

自學筆記之歸併排序

歸併排序主要利用了分治思想,它的過程如下:

1.分解成子問題:將n個元素分解為兩個具有n/2的子問題。

2.遞迴求解子問題:利用遞迴排序這兩個子問題。

3.歸併子問題:歸併子問題的解來產生排序好的答案。

歸併排序中最終要的一步是將兩個子問題的解合併,在這裡我們設計乙個函式merge(a,p,q,r),其中a代表待排序的陣列,p,q,r分別表示陣列的下標,滿足p<=q實現的偽**如下:

實現過程是利用兩個陣列來儲存已經排序好的子陣列,然後將這兩個陣列合併為乙個陣列並儲存在原陣列中。下圖1-1為圖示過程:

圖1-1 歸併過程圖示

下面為歸併演算法的偽**:

假設陣列的起始下標為1,我們就可以呼叫merge-sort(a,1,a.length)實現歸併排序。

時間複雜度分析:

由於歸併排序的過程就是將乙個問題分解為兩個同等大小的子問題,並將所得的結果組合。這樣我們可以得到時間複雜度的關係式如下:

下圖利用遞迴樹求解這個表示式:

最後可以求出歸併排序的時間複雜度為o(nlgn)。

下圖為實現的c++**:

#includeusing namespace std;

#define infty 2147483647;

void mergesort(int *,int,int);

void merge(int *,int,int,int);

int main()

; mergesort(a,0,9);

for(int i=0;i<10;i++)

{ cout<

歸併排序筆記

將兩個的有序數列合併成乙個有序數列,我們稱之為 歸併 歸併排序 如果要將乙個陣列排序,可以先 遞迴地 將它們分成兩半進行排序,然後將結果歸併起來。下面介紹另外兩種方法,分別是自頂向下歸併和自底向上歸併,圖示參考連線 但是我感覺裡面的那個自下而上的演算法感覺有點複雜,所以我總結了演算法第四版上的 如下...

排序之歸併排序

歸併排序和快速排序的思想一樣,都是依據分治法 遞迴 兩者不同的是,歸併需要對子問題的解進行合併,即合併兩個已排序的表,合併的時間為線性的,最多進行了n 1次比較,其中n是元素的總數。歸併排序的基本思路就是將陣列分成二組a和b,如果這二組組內的資料都是有序的,那麼就可以很方便的將這二組資料進行排序。如...

排序之歸併排序

歸併排序還是有點雲裡霧裡 尤其是遞迴的時候的狀態樹與函式呼叫時的棧的狀態不太清楚,需要寫 加斷點做測試 先記錄下來,後面有時間再弄,先查到乙個用斷點測試後,描述歸併排序時遞迴狀態樹的部落格 其實如果按照 極客大學 演算法訓練營的覃超老師講的分治的模板,應該比較好寫出來 分治的模板 int divid...