歸併排序主要的過程是將大陣列拆分為小陣列,再將小陣列問題解決,然後歸併處理組成新無問題的陣列再次歸併。
上**:
#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...