Python排序演算法之歸併排序

2021-09-28 19:45:07 字數 1210 閱讀 4398

將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序是一種穩定的排序方法。

我的理解是:

將乙個列表對半分成左右兩個子列表,再分別對左右子列表繼續對半分,不斷對半分,直到分成左右子列表各乙個元素時結束,這時每個子列表都是有序的(乙個元素當然有序),再對左右兩個有序列表合併成乙個有序的列表。這是乙個遞迴過程。

上**:

def merge(left, right):

merged =

i, j = 0, 0

left_len, right_len = len(left), len(right)

while(i < left_len and j < right_len):

if(left[i] <= right[j]): # 對左右子列表中的元素進行排序並放入merged列表中

i += 1

else:

j += 1

merged.extend(left[i:]) # 對左右子列表中剩下的未歸併的元素歸併

merged.extend(right[j:]) # 為什麼會出現這種情況呢:原因是左右子列表長度可能會不一樣,勢必會有乙個子列表先歸併完

return merged

def mergesort(a):

a_len = len(a)

if(a_len <= 1): # 當列表元素少於等於乙個時,直接返回列表

return a

mid = a_len // 2

left = mergesort(a[:mid]) # 歸併排序左列表

right = mergesort(a[mid:]) # 歸併排序右列表

return merge(left, right) # 合併排好序的左右兩個子列表

a = [3,4,1,2,7,6,5,0]

a1 = mergesort(a)

print(a1)

還是借用圖來方便理解一下:

對於長度為n的列表,歸併排序演算法將列表分開成子列表一共要

每步都是合併有序列表的過程,時間複雜度可以記為o(n)。故歸併排序演算法的時間複雜度為

Python排序演算法之歸併排序

將乙個列表的兩段有序部分進行合併,稱為一次歸併最壞情況 o nlogn 平均情況 o nlogn 最好情況 o nlogn o n 穩定較複雜 usr bin python3 coding utf 8 歸併排序 將乙個列表的兩段有序部分進行合併,稱為一次歸併 時間複雜度 最壞情況 o nlogn 平...

排序演算法之歸併排序

歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...

排序演算法之歸併排序

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...