日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python归并排序 分词_python实现归并排序,归并排序的详细分析

發(fā)布時間:2023/12/10 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python归并排序 分词_python实现归并排序,归并排序的详细分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

學(xué)習(xí)歸并排序的過程是十分痛苦的。它并不常用,看起來時間復(fù)雜度好像是幾種排序中最低的,比快排的時間復(fù)雜度還要低,但是它的執(zhí)行速度不是最快的。

很多朋友不理解時間復(fù)雜度低為什么運行速度不一定快,這個不清楚的伙伴可以看下我之前發(fā)表的文章http://www.cnblogs.com/Lin-Yi/p/7301535.html

看完之后也許你會對時間復(fù)雜度有一個新的認(rèn)識。

我談的觀點往往不是官方的定義,我希望能幫助更多基礎(chǔ)薄弱的同學(xué)讀懂思想~

歸并排序:

先分開再合并,分開成單個元素,合并的時候按照正確順序合并

假如我們有一個n個數(shù)的數(shù)列,下標(biāo)從0到n-1

首先是分開的過程

1 我們按照 n//2 把這個數(shù)列分成兩個小的數(shù)列

2 把兩個小數(shù)列 再按照新長度的一半 把每個小數(shù)列都分成兩個更小的

。。。一直這樣重復(fù),一直到每一個數(shù)分開了

比如: 6 5 4 3 2 1

第一次 n=6 n//2=3 分成 6 5 4 3 2 1

第二次 n=3 n//2=1 分成 6 5 4 3 2 1

第三次 n=1的部分不分了

n=2 n//2=1 分成 5 4 2 1

之后是合并排序的過程:

3 分開之后我們按照最后分開的兩個數(shù)比較大小形成正確順序后組合綁定

剛剛舉得例子 最后一行最后分開的數(shù)排序后綁定 變成 4 5 1 2

排序后倒數(shù)第二行相當(dāng)于把最新分開的數(shù)排序之后變成 6 4 5 3 12

4 對每組數(shù)據(jù)按照上次分開的結(jié)果,進(jìn)行排序后綁定

6 和 4 5(兩個數(shù)綁定了) 進(jìn)行排序

3 和 1 2(兩個數(shù)綁定了) 進(jìn)行排序

排完后 上述例子第一行待排序的 4 5 6 1 2 3 兩組數(shù)據(jù)

5 對上次分開的兩組進(jìn)行排序

拿著 4 5 6 1 2 3兩個數(shù)組,進(jìn)行排序,每次拿出每個數(shù)列中第一個(最小的數(shù))比較,把較小的數(shù)放入結(jié)果數(shù)組。再進(jìn)行下一次排序。

每個數(shù)組拿出第一個數(shù),小的那個拿出來放在第一位 1 拿出來了, 變成4 5 6 2 3

每個數(shù)組拿出第一個書比較小的那個放在下一個位置 1 2被拿出來, 待排序 4 5 6 2

每個數(shù)組拿出第一個書比較小的那個放在下一個位置 1 2 3 被拿出來, 待排序 4 5 6

如果一個數(shù)組空了,說明另一個數(shù)組一定比排好序的數(shù)組最后一個大 追加就可以結(jié)果 1 2 3 4 5 6

相當(dāng)于我們每次拿到兩個有序的列表進(jìn)行合并,分別從兩個列表第一個元素比較,把小的拿出來,在拿新的第一個元素比較,把小的拿出來

這樣一直到兩個列表空了 就按順序合并了兩個列表

結(jié)束

時間復(fù)雜度: 最好最壞都是 O( n log n )

穩(wěn)定性:穩(wěn)定

缺點:每次拆分?jǐn)?shù)組都要開心的數(shù)組, 每次合并數(shù)組都要開新數(shù)組,空間復(fù)雜度很大

在python中這樣實現(xiàn)

def merge_sort( li ):

#不斷遞歸調(diào)用自己一直到拆分成成單個元素的時候就返回這個元素,不再拆分了

if len(li) == 1:

return li

#取拆分的中間位置

mid = len(li) // 2

#拆分過后左右兩側(cè)子串

left = li[:mid]

right = li[mid:]

#對拆分過后的左右再拆分 一直到只有一個元素為止

#最后一次遞歸時候ll和lr都會接到一個元素的列表

# 最后一次遞歸之前的ll和rl會接收到排好序的子序列

ll = merge_sort( left )

rl =merge_sort( right )

# 我們對返回的兩個拆分結(jié)果進(jìn)行排序后合并再返回正確順序的子列表

# 這里我們調(diào)用拎一個函數(shù)幫助我們按順序合并ll和lr

return merge(ll , rl)

#這里接收兩個列表

def merge( left , right ):

# 從兩個有順序的列表里邊依次取數(shù)據(jù)比較后放入result

# 每次我們分別拿出兩個列表中最小的數(shù)比較,把較小的放入result

result = []

while len(left)>0 and len(right)>0 :

#為了保持穩(wěn)定性,當(dāng)遇到相等的時候優(yōu)先把左側(cè)的數(shù)放進(jìn)結(jié)果列表,因為left本來也是大數(shù)列中比較靠左的

if left[0] <= right[0]:

result.append( left.pop(0) )

else:

result.append( right.pop(0) )

#while循環(huán)出來之后 說明其中一個數(shù)組沒有數(shù)據(jù)了,我們把另一個數(shù)組添加到結(jié)果數(shù)組后面

result += left

result += right

return result

if __name__ == ‘__main__‘:

li = [5,4 ,3 ,2 ,1]

li2 = merge_sort(li)

print(li2)

算法過程理解起來非常痛苦 嗚嗚!好委屈

不過我希望大家靜下心來一點點學(xué),一定會有所收獲!

總結(jié)

以上是生活随笔為你收集整理的python归并排序 分词_python实现归并排序,归并排序的详细分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。