排序演算法(四)之歸併排序
阿新 • • 發佈:2021-11-18
一、歸併排序
什麼是歸併?
歸併排序的原理是什麼?
能不能用python程式碼敲出一個例項?
同樣的,這篇文章的目的也是要為大家揭開這幾個疑惑。
歸併排序:從字面意思上來看,主要是歸和並,也就是先歸類,分開,然後再合併起來。採用"分治法"的思想,分而治之,一半一半的拆分去排序
我們通過例子來一步步看懂它的原理。比如:有一個列表【8,4,5,7,3,1,6,2】,請用歸併排序的方法將其升序排列
①先把他們一半一半的拆開:{8,4,5,7}、{3,1,6,2}
②再接著拆 {8,4}、{5,7}、 {3,1}、{6,2}
③在已拆分的子序列裡面,比較大小:第一小組,4比8小,4排左邊,8排右邊;同理其他組別也是一樣的道理,小的往左排,大的往右排
{4,8}、{5,7} {1、3}、{2,6}
④再合併: {4,5,7,8} {1,2,3,6}
⑤最後合併: {1,2,3,4,5,6,7,8}
其原理的實質就是先分開,後合併;分開之後再比大小,最後又合併,放到一個大的序列裡面
看下面的python程式碼實現:
def merge_Sort(arr): import math if (len(arr) < 2): return arr # 從中間開始一分為二 middle = math.floor(len(arr) / 2) left, right = arr[0:middle], arr[middle:] return merge(merge_Sort(left), merge_Sort(right)) # 在小的序列裡面的左右兩個數進行大小比較 def merge(left, right): result = [] while left and right: if left[0] <= right[0]: result.append(left.pop(0)) else: result.append(right.pop(0)); while left: result.append(left.pop(0)) while right: result.append(right.pop(0)); return result li4 = [8, 4, 5, 7, 3, 1, 6, 2] print(merge_Sort(li4))
同樣的,再舉出一個例子: