排序演算法之歸併排序及C 實現

2021-10-25 16:16:35 字數 1193 閱讀 9403

歸併排序思想:將原陣列拆成前後兩半,遞迴地對前半部分和後半部分分別執行排序過程,再將排好序的前後兩部分合併。

典型的分治問題,而分治一般用遞迴去解。

歸併排序也是基於比較的排序。

歸併排序穩定。

**

template

<

typename t>

void

merge

(t* arr,

int l,

int m,

int r, t* aux_arr)

else

}while

(l <= m)

while

(k <= r)

//copy aux_arr back

for(

int i =

0; i < numelements;

++i, r--)}

template

<

typename t>

void

mergesortdrive

(t* arr,

int l,

int r, t* aux_arr)

//mergesort主程式

template

<

typename t>

void

mergesort

(t* arr, size_t size)

貼一張圖:來自《資料結構與演算法分析》一書。

時間複雜度:分治問題,寫出遞迴公式,求解即可。

遞迴公式:t(n) = 2t(n/2) + o(n)

時間複雜度為o(nlogn),空間複雜度為o(n),(用了乙個輔助陣列o(n),還有遞迴呼叫的函式棧空間logn )。

結果

紙上得來終覺淺,絕知此事要躬行。

排序演算法之歸併排序及Java實現

選擇排序 直接選擇排序,堆排序 交換排序 氣泡排序,快速排序 插入排序 直接插入排序,希爾排序 歸併排序 桶式排序 基數排序 歸併排序利用的是分治的思想實現的,對於給定的一組資料,利用遞迴與分治技術將資料序列劃分成為越來越小的子串行,之後對子序列排序,最後再用遞迴方法將排好序的子串行合併成為有序序列...

排序演算法C 實現之歸併排序詳解

將一組無序陣列變為有序 文中暫定為 陣列 向量 先考慮兩個有序向量如何合併成為乙個新的有序向量 我們可以認為任務目標想獲得的有序向量是由有序向量a和b組成,其中有序向量a又是由兩個有序向量a1和a2組成,對b a1 a2繼續往下分,直到向量中元素個數為1,此時,該向量自然是有序的。這就是在遞迴 這就...

歸併排序演算法實現(C )

歸併操作 merge 也叫歸併演算法,指的是將兩個已經排序的序列合併成乙個序列的操作 1 i 3 1 6 8 38 100 202 301 4 根據例子實現的演算法為 include using namespace std int a void merge array int a,int n,int...