將乙個列表的兩段有序部分進行合併,稱為一次歸併
最壞情況:o(nlogn)
平均情況:o(nlogn)
最好情況:o(nlogn)
o(n)
穩定
較複雜
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""歸併排序
將乙個列表的兩段有序部分進行合併,稱為一次歸併
時間複雜度:
最壞情況:o(nlogn)
平均情況:o(nlogn)
最好情況:o(nlogn)
空間複雜度:o(n)
穩定性:穩定
複雜性:較複雜
"""# 歸併
defmerge
(ls, low, mid, high)
:"""歸併操作
args:
:param ls: list, 待歸併的列表
:param low: int, 第一段有序列表的起點
:param mid: int, 兩段有序列表的中點
:param high: int, 第二段有序列表的終點
"""ltmp =
i = low
j = mid +
1while i <= mid and j <= high:
if ls[i]
< ls[j]:)
i +=
1else:)
j +=
1while i <= mid:
) i +=
1while j <= high:
) j +=
1 ls[low:high +1]
= ltmp
# 歸併排序
defmerge_sort
(ls, low, high)
:"""歸併排序
將列表分解得越來越小,直到只有乙個元素
args:
:param ls: list, 待歸併的列表
:param low: int, 當前列表的起點
:param high: int, 當前列表的終點
"""if low < high:
mid =
(low + high)//2
merge_sort(ls, low, mid)
merge_sort(ls, mid +
1, high)
merge(ls, low, mid, high)
import random
ls =
list
(range(20
))random.shuffle(ls)
merge_sort(ls,0,
len(ls)-1
)print
(ls)
Python排序演算法之歸併排序
將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併排序是一種穩定的排序方法。我的理解是 將乙個列表對半分成左右兩個子列表,再分別對左右子列表繼續對半分,不斷對半分,直到分成左右子列表各乙個元素時結束,這時每個子列表都...
排序演算法之歸併排序
歸併排序也是經典的使用分治法思想的代表演算法之一。歸併排序的效率很高,而且是一種穩定的排序。其總體的思想思路就是將待排序的元素分成大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排序的子集合合併成排好序的總集合 歸併排序c 實現如下 include void mergesort int arr...
排序演算法之歸併排序
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。歸併排序基本原理 通過對若干個有序結點序列的歸併來實現排序。所謂歸併是指將若干個已排好序的部分合併成乙個有序的部分。歸併排序基本思...