歸併排序在於把序列拆分再合併起來,使用分治法來實現,這就意味這要構造遞迴演算法
:"""將兩個列表是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)
(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...