我目前正在學習使用 Python 進行排序演算法的代碼學院課程,并且我目前正在學習合并排序。但是,顯示的代碼似乎與它們顯示的圖形相矛盾。
def merge_sort(items):
if len(items) <= 1:
return items
middle_index = len(items) // 2
left_split = items[:middle_index]
right_split = items[middle_index:]
left_sorted = merge_sort(left_split)
right_sorted = merge_sort(right_split)
return merge(left_sorted, right_sorted)
def merge(left, right):
result = []
while (left and right):
if left[0] < right[0]:
result.append(left[0])
left.pop(0)
else:
result.append(right[0])
right.pop(0)
if left:
result = left
if right:
result = right
return result
同時,這是反映這種遍歷的圖表:

所以,圖表向我展示了串列首先拆分的方式是左拆分應該是從開始到并包括中間索引的所有數字。但是,代碼說左拆分應該是從開始到不包括中間索引的所有數字。我只是瘋了還是這沒有意義?就第一次拆分而言,此代碼與圖表相矛盾嗎?
uj5u.com熱心網友回復:
對于影像中的示例,
items = [98, 13, 274, 7, 12, 981, 5]
len(items)將是 7,并且middle_index將是7 // 2 = 3,所以
left_split = items[:3] = [98, 13, 274]
right_split = items[3:] = [7, 12, 981, 5]
所以你是對的,代碼將包含右分割中的中間元素,而它包含在影像的左分割中。
然而,這并不意味著代碼沒有意義,因為merge函式關于left和是對稱的right,它不會假設串列中的一個大于另一個;只要在合并期間任一串列變空,其余的另一個串列將附加到結果的末尾。
事實上,確切的分割點與排序結果無關,如果它盡可能靠近中間,演算法會更有效率,因為這最小化了每個分割的兩個長度中較大的一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/351250.html
