歸併排序與逆序對

2021-10-02 08:39:15 字數 1241 閱讀 7767

歸併排序在於把序列拆分再合併起來,使用分治法來實現,這就意味這要構造遞迴演算法

:"""將兩個列表是s1,s2按順序融合為乙個列表s,s為原列表"""

# j和i就相當於兩個指向的位置,i指s1,j指s2

i = j =

0while i+j<

len(s)

:# j==len(s2)時說明s2走完了,或者s1沒走完並且s1中該位置是最小的

if j==

len(s2)

or(i<

len(s1)

and s1[i]

s[i+j]

= s1[i]

i +=

1else

: s[i+j]

= s2[j]

j +=

1def

merge_sort

(s):

"""歸併排序"""

n =len(s)

# 剩乙個或沒有直接返回,不用排序

if n <2:

return

# 拆分

mid = n //

2 s1 = s[

0:mid]

s2 = s[mid:n]

# 子串行遞迴呼叫排序

merge_sort(s1)

merge_sort(s2)

# 合併

merge(s1,s2,s)

if __name__ ==

'__main__'

: s =[1

,7,3

,5,4

] merge_sort(s)

print

(s)'''

參考:'''

求序列的逆序對,先看下面的例子:

設有數列

初始狀態:6,202,100,301,38,8,1

第一次歸併後:,,,,比較次數:3;

第二次歸併後:,,比較次數:4;

第三次歸併後:,比較次數:4;

總的比較次數為:3+4+4=11;

逆序數為14;

為了找到每乙個數後面有多少個數小於他自己,,其實可以對其進行排序,然後看每乙個數進行了多少次交換。

歸併排序與逆序對

歸併問題按照分治三步法進行介紹 劃分問題 把序列分成元素個數盡量相等的兩半 遞迴求解 把兩半元素分別排序 合併問題 把兩個有序表合併成乙個 借鑑乙個部落格的圖 排序演算法 四 之歸併排序 可以看到這種結構很像一棵完全二叉樹,本文的歸併排序我們採用遞迴去實現 也可採用迭代的方式去實現 分階段可以理解為...

歸併排序與逆序對

最近學習逆序對,發現竟然要學習歸併排序,於是只好學了一下 之前一直用c stl的sort函式 發現思想和線段樹竟然驚人的相似,先放一張圖你們就懂了 怎麼樣,是不是發現這就是一棵線段樹!其實歸併排序利用了二分的思想,即分而治之。歸併排序是一種穩定的方法,時間複雜度 o nlogn 空間複雜度 o n ...

歸併排序與逆序對

題目描述 給定你乙個長度為n的整數數列。請你使用歸併排序對這個數列按照從小到大進行排序。並將排好序的數列按順序輸出。輸入格式 輸入共兩行,第一行包含整數 n。第二行包含 n 個整數 所有整數均在1 109範圍內 表示整個數列。輸出格式 輸出共一行,包含 n 個整數,表示排好序的數列。資料範圍 1 n...