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

二路歸併排序Python實現

看了網上一些寫法,總感覺 有點複雜,所以我參考之前寫的程式,用Python  改寫了一個 二路歸併排序 演算法 。

二路歸併排序主要運用了“分治演算法”,分治演算法就是將一個大的問題劃分為n個規模較小而結構相似的子問題。 這些子問題解決的方法都是類似的,解決掉這些小的問題之後,歸併子問題的結果,就得到了“大”問題的解。

核心虛擬碼 :



def  MergeSort(array,p,q):
    if p< q:
        # 轉成int  型別
        mid =int((p+q)/2)

# 左邊 排序
        MergeSort(array,p,mid)

#右邊排序
        MergeSort(array,mid+1,q)

# 進行merge,把已經排序的的陣列,進行整體的合併
        Merge(array,p,mid,q)

下面看程式碼

# coding=utf-8
'''
@author:chang
二路 歸併排序 ,Python  實現
MergeSort(array,p,q)


 Merge(array,low,middle,high)  對這個函式進行,對array 進行merge ,就是 把array ,
 前半部分是已經排序,  後半部分已經排序
 把 array  組成一個新的array, Merge 就是把 array 左半部分,和右半部分分別 取出一個值比較,誰小 ,誰就放在arr[] 數組裡面,
 最後如果 left_array 有剩餘, 直接 copy 到 array[]數組裡面;
 left_array 有剩餘, 直接 copy 到 array[]數組裡面。
'''

import  time
import  sys

def  Merge(array,low,middle,high):
    n1 = middle -low +1;
    n2 = high-middle
    left_array=[]
    right_array=[]

    # 可以理解相當於申請一塊空間
    for t in range(0, int(n1)):
        left_array = ['0'] + left_array

    for t in range(0, int(n1)):
        right_array = ['0'] + right_array

    # 把array 左邊的值,放到left_arr  數組裡面
    for i in range(0,n1):
        left_array[i]=array[i+low]

    # 把 array 右邊的值,放到 right_arr  數組裡面
    for j in range(0,n2):
        right_array[j]=array[j+middle+1]

    i,j =0,0
    k = low
    while  i!=n1 and j !=n2:
        if left_array[i]<= right_array[j]:
            array[k]=left_array[i]
            k += 1
            i += 1
        else:
            array[k]=right_array[j]
            k += 1
            j += 1

           
    while i < n1:
        array[k]=left_array[i]
        k += 1
        i += 1

    while j< n2:
        array[k]=right_array[j]
        k += 1
        j += 1


def  MergeSort(array,p,q):
    if p< q:
        # 轉成int  型別
        mid =int((p+q)/2)
        MergeSort(array,p,mid)
        MergeSort(array,mid+1,q)
        Merge(array,p,mid,q)


if __name__=="__main__":
    # mylist=[1,45,56,34,67,88,54,22]
    mylist = [1, 34, 6, 21, 98, 31, 7, 4, 56, 59, 27, 13, 36, 47, 67, 37, 25, 2]

    length = len(mylist)
    MergeSort(mylist, 0, length-1);

    print(mylist)

更新時間:2018-04-04 22:52:23 

更新 :  對於merge 操作, 可以直接,  通過 [None]*n  來先生成好. 而不需要我之前的寫法.  那個不是python 的風格. 這樣寫更像Python 風格的程式碼. 

def Merge(array, low, middle, high):
    n1 = middle - low + 1
    n2 = high - middle
    left_array = [None]*n1
    right_array = [None]*n2

    # 把array 左邊的值,放到left_arr  數組裡面
    for i in range(0, n1):
        left_array[i] = array[i + low]

    # 把 array 右邊的值,放到 right_arr  數組裡面
    for j in range(0, n2):
        right_array[j] = array[j + middle + 1]

    i, j = 0, 0
    k = low
    while i != n1 and j != n2:
        if left_array[i] <= right_array[j]:
            array[k] = left_array[i]
            k += 1
            i += 1
        else:
            array[k] = right_array[j]
            k += 1
            j += 1

    while i < n1:
        array[k] = left_array[i]
        k += 1
        i += 1

    while j < n2:
        array[k] = right_array[j]
        k += 1
        j += 1

下面看結果:

參考 文件:

分享快樂,留住感動。                                                                              2017年 10月 16日 星期一 16:50:07   ---frank