1. 程式人生 > >python二路歸併排序實現法

python二路歸併排序實現法

歸併原理: 第一步:申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列 第二步:設定兩個指標,最初位置分別為兩個已經排序序列的起始位置 第三步:比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置 重複步驟3直到某一指標超出序列尾 將另一序列剩下的所有元素直接複製到合併序列尾

  歸併過程:

比較a[i]和a[j]的大小,若a[i]≤a[j],則將第一個有序表中的元素a[i]複製到r[k]中,並令i和k分別加上1;否則將第二個有序表中的元素a[j]複製到r[k]中,並令j和k分別加上1,如此迴圈下去,直到其中一個有序表取完,然後再將另一個有序表中剩餘的元素複製到r中從下標k到下標t的單元。歸併排序的演算法我們通常用遞迴實現,先把待排序區間[s,t]以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸併操作合併成有序的區間[s,t]。

python程式碼:

def MergeSort(lists):
    if len(lists) <=1:
        return lists
    num = len(lists)/2
    left = MergeSort(lists[:num])
    right = MergeSort(lists[num:])
    return Merge(left,right)

def Merge(left,right):
    r,l=0,0
    reslut=[]
    while l<len(left) and r<len(right):
        if left[l] < right[r]:
            reslut.append(left[l])
            l+=1
        else:
            reslut.append(right[r])
            r+=1
    reslut+= right[r:]
    reslut+= left[l:]
    return reslut
    
if __name__ == '__main__':
    arr = [4,2,15,4,6,7,1]
    print MergeSort(arr)