用Python 學習資料結構與演算法 四 歸併排序

2021-07-16 12:47:26 字數 2274 閱讀 7899

歸併排序主要的過程是將大陣列拆分為小陣列,再將小陣列問題解決,然後歸併處理組成新無問題的陣列再次歸併。

上**:

#coding=utf-8

#歸併運算

#array=》陣列

#lpos=》左座標

#mpos=》中座標

#rpos=》右座標

defmerge

(array, lpos, mpos, rpos):

#切片左右陣列

leftarr = array[lpos:mpos]

rightarr = array[mpos:rpos]

#獲得陣列長度

ntotal = len(array)

#建立整理陣列後存放的新容器

arrnew = [0,] * ntotal

#獲得左右陣列長度

leftlen = len(leftarr)

rightlen = len(rightarr)

#左右遍歷引索量

leftindex = 0

rightindex = 0

#print(leftarr, rightarr)

#向新容器裡新增相應合適數值

for i in range(0, ntotal):

#print((leftindex, leftlen), (rightindex, rightlen), arrnew)

if leftindex == leftlen:

#特殊情況,左陣列新增完

arrnew[i] = rightarr[rightindex]

rightindex = rightindex + 1

elif rightindex == rightlen:

#特殊情況,右陣列新增完

arrnew[i] = leftarr[leftindex]

leftindex = leftindex + 1

else:

#情況2,比較左右陣列值

if leftarr[leftindex] > rightarr[rightindex]:

arrnew[i] = rightarr[rightindex]

rightindex = rightindex + 1

else:

arrnew[i] = leftarr[leftindex]

leftindex = leftindex + 1

#返回新容器

return arrnew

#遞迴拆分

#array=》陣列

#lpos=》左座標

#rpos=》右座標

defmerge_sort

(array, lpos, rpos):

#print((lpos, rpos), array)

#判斷rpos-1是為了處理array的切片問題

if lpos < (rpos - 1):

#mpos = (rpos - lpos) // 2

#取中引索

mpos = rpos // 2

#切片左陣列

leftarr = array[lpos:mpos]

#print((lpos, mpos, rpos), leftarr, array)

#遞迴左陣列

leftarr = merge_sort(leftarr, 0, len(leftarr))

#切片右陣列

rigtharr = array[mpos:rpos]

#遞迴右陣列

rigtharr = merge_sort(rigtharr, 0, len(rigtharr))

#print('rigth',(lpos, mpos, rpos), rigtharr, array)

#組合陣列

resultarr = leftarr + rigtharr

#排序return merge(resultarr, 0, len(resultarr) // 2, len(resultarr))

#返回陣列中只有乙個元素

return array

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

#print(merge(a,0, len(a) // 2, len(a)))

print(merge_sort(a, 0, len(a)))

輸出結果 :

[1, 2, 3, 4, 5, 6]
用切片寫的我暈頭轉向的,更清晰的方式則是在原陣列上修改,這樣只用考慮座標,而不用去想切片特性造成的影響。

用python學習資料結構與演算法 堆疊

堆疊 堆疊 stack 是一種後進先出 lifo 的線性資料結構,對堆疊的插入和刪除操作都只能在棧頂 top 進行。棧和佇列主要用於計算過程中儲存臨時資料。堆疊 adt 抽象資料型別 一般提供以下介面 stack 建立堆疊 push item 向棧頂插入項 pop 返回棧頂的項,並從堆疊中刪除該項 ...

用Python 學習資料結構與演算法 三 選擇排序

選擇排序是將陣列從開始按順序找出相應位置上合適的元素,到達n位置時則不用再尋找該位置元素,因為這時所有元素已經就位。上 coding utf 8 defselectsort array i 0 只用選n 1個數進行排序,因為選到最後第n個數是不用排序的 for x in range 0,len ar...

用Python 學習資料結構與演算法 六 最大子串行

實現最大子串行,其主要需要注意的是 連續 一詞。然而我在檢視 演算法導論 書本時,發現 本身無問題,同樣的遞迴 在c 中是可以正常執行的,在python當中卻無法正常執行,需要新增哨兵才可以正常的使用。注 本身無問題 上 coding utf 8 class infotype def init se...