Python實現歸併排序

2021-08-07 08:32:14 字數 2462 閱讀 3850

def

mergesort

(seq):

if len(seq)<=1:

return seq

else:

mid=int(len(seq)//2)

lpart=mergesort(seq[:mid])

rpart=mergesort(seq[mid:])

return merge(lpart,rpart)

defmerge

(lpart,rpart):

newlist = list()

a,b=0,0

while aand bif lpart[a]<=rpart[b]:

a+=1

else:

b+=1

while a < len( lpart ) :

a+=1

while b < len( rpart ) :

b+=1

return newlist

if __name__=='__main__':

seq=[23,34,4,5,23,-1,67,55]

print(mergesort(seq))

mergesort() 函式提供了乙個歸併演算法的簡單的遞迴實現,但它有幾個缺點。首先,它依賴於分片操作,這就阻止了我們使用這個函式來給陣列排序,因為陣列結構沒有提供分片操作。第二,每次遞迴呼叫時列表被劃分,都建立新的物理子列表。 而分片是乙個耗時操作,因為必須建立乙個新的列表,把分片的內容從初始列表複製過去。

每次兩個子列表合併時又要建立乙個新列表,整個處理過程增加了更過時間。

最後,排好序的列表沒有被包含進傳給函式的同乙個初始列表中。

乙個更好的實現

# 使用歸併排序公升序排序乙個陣列或列表

defmergesort

( theseq ):

n = len( theseq )

# 建立合併子串行時使用的臨時陣列

tmparray = array( n )

# 呼叫私有的遞迴合併排序函式

recmergesort( theseq, 0, n-1, tmparray )

#使用歸併排序按公升序排序乙個虛擬子串行

defrecmergesort

( theseq, first, last, tmparray ):

# 比較虛擬子串行的元素由範圍[first...last]指定

# tmparray 在歸併排序演算法的合併階段用來做臨時儲存

# 檢查基本情況: 虛擬序列只包含單一項

if first == last :

return;

else :

# 計算出中間點

mid = (first + last) // 2

# 分開序列並執行遞迴

recmergesort( theseq, first, mid, tmparray )

recmergesort( theseq, mid+1, last, tmparray )

# 合併兩個排好序的子串行

mergevirtualseq( theseq, first, mid+1, last+1, tmparray )

# 合併兩個排好序的虛擬子串行: [left..right) [right..end)

# 使用tmparray 做中間儲存.

def mergevirtualseq( theseq, left, right, end, tmparray ):

# 初始化兩個子串行索引變數

a = left

b = right

# 為合併完的結果陣列初始化乙個索引變數

m = 0

# 合併兩個序列直到其中乙個為空.

while a < right and b < end :

if theseq[a]

< theseq[b] :

tmparray[m] = theseq[a]

a += 1

else :

tmparray[m] = theseq[b]

b += 1

m += 1

# 如果左邊的子串行包含更多的項則把它們追加到tmparray.

while a < right :

tmparray[m] = theseq[a]

a += 1

m += 1

# 如果左邊的子串行包含更多的項則把它們追加到tmparray

while b < end :

tmparray[m] = theseq[b]

b += 1

m += 1

# 把排好序的子串行複製回初始序列中

for i in range( end - left ):

theseq[i+left] = tmparray[i]

python實現歸併排序

歸併排序,先把陣列按中間分為2個單元,直至每個單元僅包含1個元素,然後依次合併2個單元至一臨時陣列 def merge str,start index,end index,mid,temp j start index k mid 1 i 0while j mid and k end index if...

Python實現歸併排序

歸併排序是典型的分治法的應用 思想 先遞迴分解陣列,再合併陣列 原理 將陣列分解最小之後,然後合併兩個有序陣列,基本思想是比較兩個陣列的最前面的數,誰小就取誰,取完後,將相應的指標後移以為。然後再比較,直到乙個陣列為空,最後把另乙個陣列的剩餘部分複製過來即可。python 實現 歸併排序 def m...

歸併排序python實現

歸併排序在於把序列拆分再合併起來,使用分治法來實現,這就意味這要構造遞迴演算法 首先是乙個例子 原序先通過一半一半的拆分,然後 然後再一步一步的向上合併,在合併的過程中完成了排序,合併排序演算法如下 def merge s1,s2,s 將兩個列表是s1,s2按順序融合為乙個列表s,s為原列表 j和i...