您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何使用Python實現的歸并排序算法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
歸并排序(英語:Merge sort),是創建在歸并操作上的一種有效的排序算法,效率為 。1945年由約翰·馮·諾伊曼首次提出。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用,且各層分治遞歸可以同時進行[1]。
采用分治法:
看完上面的定義,如果你感到有點懵,那就對了本文就是寫給你的。我們通過圖文來詳細地介紹算法的流程。算法的核心只有4個字分割和合并。
假定我們對下面的序列,按照從小到大進行排序。
94, 45, 82, 33, 25, 59, 94, 65, 23
當然你很快地手動就能完成排序任務,但30萬個數字你可能就會崩潰了。還是先來看這個例子,先將這個序列平均分割。一共有9個數字,取中間位置是4.5,取整的結果為4。分成兩個子序列,前4個元素和后5個元素,然后分別對兩個子序列遞歸操作,直到子序列只有一個元素為止。
上面的步驟完成了分割,接下來開始合并了。最小的兩個子序列是94和45,于是合并這兩個子序列,得到序列[45, 94],另外的子序列是[33, 82],于是合并這兩個子序列就得到左半部分[33, 45, 82, 94]。
這里元素較少,你可能并沒有看清楚,就得到了左半部分有序子序列(前4個元素)。同樣的操作我們得到后面5個元素的有序子序列,最后來合并這兩個子序列。下文會詳細說明。
[33, 45, 82, 94]
[23, 25, 59, 65, 94]
合并的過程都是一樣的,下面gif動圖清楚地演示了兩個子序列的合并過程。(由于受公眾號的限制,無法給出完成的演示)。完整演示可以看后面的視頻。
下面是用Python實現的歸并排序算法的代碼,僅供參考:
import typing as t
def sort(data: t.List[int]):
"""
sort data
"""
if len(data) <= 1:
return data
mid = len(data) // 2
left = sort(data[:mid])
right = sort(data[mid:])
return merge(left, right)
def merge(left: t.List[int], right: t.List[int]):
"""
merge two list
"""
i = 0
j = 0
ret = []
while i < len(left) and j < len(right):
if left[i] < right[j]:
ret.append(left[i])
i += 1
else:
ret.append(right[j])
j += 1
if i == len(left):
ret.extend(right[j:])
if j == len(right):
ret.extend(left[i:])
return ret
if __name__ == '__main__':
d = [45, 94, 33, 82, 25, 59, 94, 65, 23]
data = sort(d)
print(data)
感謝各位的閱讀!關于“如何使用Python實現的歸并排序算法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。