演算法 歸併排序

2021-08-11 20:26:18 字數 716 閱讀 4537

將待排序陣列a[n]看做n個長度為1的有序序列,然後將每兩個相鄰的有序序列歸併為乙個新的有序序列,重複這個過程直到整個陣列有序,這就是歸併排序的基本思想。

所以我們可以將歸併排序的過程分為兩步:

分解:按照確定的長度對陣列進行劃分

歸併: 對劃分好的各個部分進行兩兩歸併

可以想象歸併排序的過程類似乙個二叉樹的形成過程,所以易得時間複雜度為o(nlgn)

由於在歸併時使用了乙個新申請的陣列,所以空間複雜度為o(n)。不過注意到每次呼叫merge函式時都要申請一次空間,這會給程式帶來額外的開銷。所以也可以在mergesort函式中定義乙個陣列b[n],然後作為引數傳遞給函式merge。

歸併排序是穩定的。

/*歸併過程*/

void merge(int a, int left, int mid, int right)

else

}while(i <= mid)

while(j <= right)

for(i = left, k = 0; i <= right; i++, k++)

a[i] = b[k];

free(b);

}/*分解過程*/

void resolve(int a, int gap, int

length)

void mergesort(int a, int

length)

歸併演算法 歸併排序

歸併演算法 歸併排序 這周需要用到歸併演算法,於是找了找相關的資料,整理如下 歸併排序 merge sort 是利用 歸併 技術來進行排序。歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。兩路歸併演算法 1 演算法基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low...

歸併排序演算法

include stdafx.h include include include 合併兩段已經排好序的列表 void merge int list int mergelist int left int mid int right else if i mid else 將列表list按照seglen分...

歸併排序演算法

這個演算法感覺比插入難理解一些,下面說說我的理解 歸併排序的步驟 1.把長度為n的序列分為兩個長度為n 2的子串行 2.對這兩個子串行分別採用歸併排序 3.將兩個子串行合併成乙個最終的排序序列 通過步驟2可看到 在歸併排序中又用了歸併排序,可見這是乙個遞迴的過程。例如乙個陣列 a 8 下面採用遞迴排...