所以我盡力想象這個合并排序程序將如何進行,但我被遞回和三重 While 回圈所困擾,以及這些遞回如何影響陣列的當前磁區 [1,9,7,10 ,11] 上半場和 [8,3,2,5,6,4] 下半場。我可以理解代碼的前半部分,但是在嘗試遵循這些 while 回圈的流程時我迷路了。非常感謝您的回答!!!
def 合并排序(陣列):
if len(array) > 1:
start_mid = array[:len(array)//2]
mid_end = array[len(array)//2:]
#recusion process
merge_sort(start_mid)
merge_sort(mid_end)
left_ind = 0
right_ind = 0
merged_ind = 0
while left_ind < len(start_mid) and right_ind < len(mid_end):
if start_mid[left_ind] < mid_end[right_ind]:
array[merged_ind] = start_mid[left_ind]
left_ind = 1
else:
array[merged_ind] = mid_end[right_ind]
right_ind = 1
merged_ind = 1
while left_ind < len(start_mid):
array[merged_ind] = start_mid[left_ind]
left_ind = 1
merged_ind = 1
while right_ind < len(mid_end):
array[merged_ind] = mid_end[right_ind]
right_ind = 1
merged_ind = 1
array_test = [1,9,7,10,11,8,3,2,5,6,4]
合并排序(陣列測驗)
列印(陣列測驗)
uj5u.com熱心網友回復:
我會說在白板上寫出遞回的每次迭代或其他東西,因為您的代碼非常簡單。如果你把它畫出來,你會看到代碼正在分割陣列,直到它不能再分割,然后運行這些回圈來改變兩半的順序,但又回到下一個最大的一半。
一種描繪方式是,每個回圈都處理特定的功能/情況,遞回呼叫將保存串列的當前版本,以便在串列的較小部分運行這些相同的功能。
第一個回圈將處理陣列的當前狀態,并根據哪一個先行對兩半進行排序,直到其中一個完成。第二個回圈處理左側仍有更多元素要通過的情況。
(即 [4,5], [1,2,3] )
第三個回圈處理右側有更多元素要通過的情況
(即 [1,2], [3,4,5] )
編輯:
如果我對您詢問陣列的橫向順序是正確的,那么它是:
[1,9,7,10,11] , [8,3,2,5,6,4] ->[1,9,] , [7,10,11] -> [1] , [9] (和排序) -> [7] , [10,11] -> (跳過排序 7) -> [10] , [11] (和排序) -> (排序 [7] , [10,11]) - > (排序 [1,9,] , [7,10,11]) -> 等等。
基本上它把這對陣列中的第一個陣列切成兩半,而且只有第一個,直到你能夠把它減到 1 的長度。一旦你完成了,第一個長度為 1 的陣列又回來了,你現在終于可以開始查看第二個陣列了。一旦您完成了該對并從該遞回呼叫回傳,您將完成上面圖層的“第一個”陣列,而現在開始該對的第二個陣列。
一旦您對該對的第二個陣列進行遞回呼叫,您將重復對一對中的第一個陣列進行優先排序的程序
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411303.html
標籤:
