二路歸併排序Python實現
阿新 • • 發佈:2019-01-22
看了網上一些寫法,總感覺 有點複雜,所以我參考之前寫的程式,用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