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...