中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用Python實現的歸并排序算法

發布時間:2022-01-17 09:17:57 來源:億速云 閱讀:181 作者:小新 欄目:大數據

這篇文章給大家分享的是有關如何使用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個元素,然后分別對兩個子序列遞歸操作,直到子序列只有一個元素為止。

如何使用Python實現的歸并排序算法

歸并排序-分割
 

上面的步驟完成了分割,接下來開始合并了。最小的兩個子序列是94和45,于是合并這兩個子序列,得到序列[45, 94],另外的子序列是[33, 82],于是合并這兩個子序列就得到左半部分[33, 45, 82, 94]。

如何使用Python實現的歸并排序算法

歸并排序-合并
 

這里元素較少,你可能并沒有看清楚,就得到了左半部分有序子序列(前4個元素)。同樣的操作我們得到后面5個元素的有序子序列,最后來合并這兩個子序列。下文會詳細說明。

[33, 45, 82, 94]
[23, 25, 59, 65, 94]
 

合并的過程都是一樣的,下面gif動圖清楚地演示了兩個子序列的合并過程。(由于受公眾號的限制,無法給出完成的演示)。完整演示可以看后面的視頻。

如何使用Python實現的歸并排序算法

 

參考代碼

下面是用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實現的歸并排序算法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南丹县| 葵青区| 大同市| 鱼台县| 花垣县| 苍南县| 靖安县| 巴里| 许昌市| 鄂伦春自治旗| 三亚市| 大洼县| 仁化县| 大姚县| 巴里| 万安县| 加查县| 宁蒗| 大荔县| 镇宁| 都匀市| 高陵县| 旬邑县| 银川市| 苗栗市| 亚东县| 建阳市| 轮台县| 九江县| 宜川县| 吕梁市| 定安县| 呼伦贝尔市| 电白县| 崇信县| 凌海市| 甘孜县| 伊吾县| 进贤县| 高要市| 青川县|