1. 程式人生 > 其它 >排序演算法(四)之歸併排序

排序演算法(四)之歸併排序

一、歸併排序
什麼是歸併?
歸併排序的原理是什麼?
能不能用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))

同樣的,再舉出一個例子: