だから私はPythonでこの単純なマージとソートのアルゴリズムを理解しようとしています。コードは次のとおりです。
def merge(left, right, lt):
"""Assumes left and right are sorted lists.
lt defines an ordering on the elements of the lists.
Returns a new sorted(by lt) list containing the same elements
as (left + right) would contain.
"""
result = []
i,j = 0, 0
while i < len(left) and j < len(right):
if lt(left[i], right[j]):
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
while (i < len(left)):
result.append(left[i])
i += 1
while (j < len(right)):
result.append(right[j])
j += 1
return result
def sort(L, lt = lambda x,y: x < y):
"""Returns a new sorted list containing the same elements as L"""
if len(L) < 2:
return L[:]
else:
middle = int(len(L)/2)
left = sort(L[:middle], lt)
right = sort(L[middle:], lt)
print left, right
return merge(left, right, lt)
私はそれがやろうとしていることを理解し、マージ関数のすべてのコードを理解し、ソート関数の基本的な理解を持っています。
私が理解していないのは、ソート関数の「else」部分が実際にどのように機能するかです。ソート関数を再帰的に呼び出して、左右の変数にますます小さな分割リストを割り当てているようです。しかし、再帰関数を呼び出すたびに新しいリストが「左」と「右」に割り当てられるため、最終結果は左と右の最小バージョンになるのではないでしょうか。
再帰の外側にあるように見えるマージ関数は、作成されたすべての分割リストをマージする必要があることをどのように認識しますか?