演算法(11) 歸併 C

2022-06-27 02:09:23 字數 774 閱讀 9695

與荷蘭國旗相比,歸併主要是二分。

1.分左右,[left-mid],[mid+1,right],

2.兩邊merge,就是分別取數,比小後放入輔助陣列中,以上兩步不停遞迴,

3.basecase為left==right,最後完成排序。

時間複雜度為o(logn)。以下為c++例項**,親測可行,供各位參考。

void merge(int arr, int l, int m, int r)

while (p1 <= m) //左邊沒排完,剩下的拷入輔助陣列中

while (p2 <= r) //右邊的沒排完,剩下的拷入輔助陣列中

for (i = 0; i < m_num; i++)//考回原陣列

deletehelp;

}//遞迴函式

void mergeprocess(int arr, int l, int r)

//basecase

int mid = l + ((r - l) >> 1);

mergeprocess(arr, l, mid);

mergeprocess(arr, mid + 1, r);

merge(arr, l, mid, r);

}//排序主函式

void mergesort_main(int arr, int m_num)

mergeprocess(arr,0,m_num-1);

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

}

C 歸併演算法

如圖是歸併演算法的示意圖。打個比方,乙個人對一副牌進行排序,然後他為了減輕工作,找來兩位志願者。每位志願者拿牌的一半,然後分別對自己拿的那一疊牌進行排序。當把自己那乙份從小到大排好之後。兩位志願者再把兩疊牌合為一疊牌。規則如下 比較手中的牌,如果自己的牌小,就把牌放到桌面上。如果一方牌放完了,另一方...

C 歸併演算法

概念 把陣列分割成兩個相同大小的子陣列,對兩個陣列進行排序,然後再將他們合併成乙個陣列。對於有奇數個元素的陣列,這個演算法建立兩個子陣列,其中乙個要比另乙個多乙個元素。include stdio.h include stdlib.h include time.h define size 10 voi...

C 歸併演算法例項

歸併演算法 把兩個或兩個以上的線性表合併在一起,形成乙個新的線性表 函式模版的基本使用 程式意圖 將兩個相同型別的線性表元素排好序,然後將他們組合成乙個排好的線性表 include using namespace std const int n 5 5個元素 輸出資料元素 template void...