python归并排序 分词_python-归并排序
代碼環境:python3.6
歸并排序采用分治法,思想是:先遞歸拆分數組,再合并數組。
1、拆分數組
假設數組一共有 n 個元素,我們遞歸對數組進行折半拆分即n//2,直到每組只有一個元素為止。
2、合并數組
算法會從最小數組開始有序合并,這樣合并出來的數組一直是有序的,所以合并兩個有序數組是歸并算法的核心,這里用兩個簡單數組示例:
步驟1:新建一個空數組存放合并結果,用l和r兩個輔助指針記錄兩個數組當前操作位置;
步驟2:從左到右逐一比較兩個小數組中的元素,較小的元素先放入新數組,指針移位,直到l或r指針超出尾部;
步驟3:指針尚未移到尾部的數組,說明還有剩余元素,將剩余元素合并到新數組尾部。
算法實現
def merge(list_left, list_right):
"""
入參數組都是有序的,此處將兩個有序數組合并成一個大的有序數組
"""
# 兩個數組的起始下標
l, r = 0, 0
new_list = []
while l < len(list_left) and r < len(list_right):
if list_left[l] < list_right[r]:
new_list.append(list_left[l])
l += 1
else:
new_list.append(list_right[r])
r += 1
new_list += list_left[l:]
new_list += list_right[r:]
return new_list
def merge_sort(mylist):
"""歸并排序
mylist: 待排序數組
return: 新數組list
"""
if len(mylist) <= 1:
return mylist
mid = len(mylist) // 2
list_left = merge_sort(mylist[:mid])
list_right = merge_sort(mylist[mid:])
return merge(list_left, list_right)
if __name__ == "__main__":
mylist = [12, 33, 199, 0, 54, 33, 11]
result = merge_sort(mylist)
print(f'歸并排序后:{result}')
算法效率
時間復雜度:O(nlogn)
歸并排序把數組一層層折半分組,長度為 n 的數組,折半層數就是 logn,每一層進行操作的運算量是 n,得出時間復雜度 O(nlogn)。
空間復雜度:O(n)
每次歸并操作需要創建額外的新數組,占用空間為 n,但這部分額外空間會隨著方法的結束而釋放,所以只需要算單次歸并操作開辟的空間即可,得出空間復雜度 O(n)。
穩定性:穩定
從算法中從左到右逐一比較,較小的先放入新數組,所以兩個值相同的元素,排序后依然保持原先后順序。
非原地排序
總結
以上是生活随笔為你收集整理的python归并排序 分词_python-归并排序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: abaqus画一个球 python_简单
- 下一篇: python的迭代器无法输出值_pyth