合并排序问题-Python

合并排序问题-Python,python,algorithm,sorting,merge,Python,Algorithm,Sorting,Merge,我的代码怎么了?它只打印一部分向量值。似乎while循环在某个点中断。我不明白为什么 def print_list(vect): for i in range(0, len(vect)): print(vect[i]) def merge_sort(vect): left = [] right = [] result = [] for i in range(0, int(len(vect)/2)): left.a

我的代码怎么了?它只打印一部分向量值。似乎while循环在某个点中断。我不明白为什么

def print_list(vect):
    for i in range(0, len(vect)):
        print(vect[i])

def merge_sort(vect):
    left = []
    right = []    
    result = []

    for i in range(0, int(len(vect)/2)):
        left.append(vect[i])
    for i in range(int(len(vect)/2), len(vect)):
        right.append(vect[i])

    left.sort()
    right.sort()
    i = 0
    j = 0

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    print(len(result))
    return result

vect = [3, 1, 5, 7, 10, 2, 0]

vect = merge_sort(vect)
def打印列表(vect):
对于范围(0,len(vect))中的i:
打印(向量[i])
def合并_排序(矢量):
左=[]
右=[]
结果=[]
对于范围(0,int(len(vect)/2)内的i:
左.追加(向量[i])
对于范围内的i(int(len(vect)/2),len(vect)):
右。追加(向量[i])
左。排序()
对。排序()
i=0
j=0
而i如果左[i]那么,您的错误是在while循环之后

while i < len(left) and j < len(right):
  ...
说明:

想象一下合并过程:i和j在开始时为0,在每一步都向前移动其中一个。你什么时候停下来?当其中一个到达终点时。假设我已经到了终点。因此,您将整个左侧部分添加到结果中,但是在j和len(右侧)之间的右侧仍然有一些元素,因此您也必须将它们添加到答案中

场外

您正在实现合并排序,因此请

left = merge_sort( left )
right = merge_sort( right )
而不是

left.sort()
right.sort()
注意:您必须在merge函数的开头向代码中添加以下检查,以避免无限递归:

if len( vect ) == 1:
   return vect
在打印列表功能中,您也可以使用

print vect
或者至少

for x in vect
print x

你的错误是在你的while循环之后

while i < len(left) and j < len(right):
  ...
说明:

想象一下合并过程:i和j在开始时为0,在每一步都向前移动其中一个。你什么时候停下来?当其中一个到达终点时。假设我已经到了终点。因此,您将整个左侧部分添加到结果中,但是在j和len(右侧)之间的右侧仍然有一些元素,因此您也必须将它们添加到答案中

场外

您正在实现合并排序,因此请

left = merge_sort( left )
right = merge_sort( right )
而不是

left.sort()
right.sort()
注意:您必须在merge函数的开头向代码中添加以下检查,以避免无限递归:

if len( vect ) == 1:
   return vect
在打印列表功能中,您也可以使用

print vect
或者至少

for x in vect
print x

while循环在左侧或右侧耗尽后立即退出。这使得未用尽列表中的所有元素都未合并

将代码更改为:

def print_list(vect):
    for i in range(0, len(vect)):
        print(vect[i])

def merge_sort(vect):
    left = []
    right = []

    result = []
    for i in range(0, int(len(vect)/2)):
        left.append(vect[i])
    for i in range(int(len(vect)/2), len(vect)):
        right.append(vect[i])

    left.sort();
    right.sort();
    i = 0
    j = 0

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    if i < len(left):
        result.extend(left[i:])
    else:
        result.extend(right[j:])

    print(len(result))
    return result

vect = [3, 1, 5, 7, 10, 2, 0]

vect = merge_sort(vect)
print vect
def打印列表(vect):
对于范围(0,len(vect))中的i:
打印(向量[i])
def合并_排序(矢量):
左=[]
右=[]
结果=[]
对于范围(0,int(len(vect)/2)内的i:
左.追加(向量[i])
对于范围内的i(int(len(vect)/2),len(vect)):
右。追加(向量[i])
left.sort();
对。排序();
i=0
j=0
而i如果left[i]则当left或right耗尽时,while循环立即退出。这使得未用尽列表中的所有元素都未合并

将代码更改为:

def print_list(vect):
    for i in range(0, len(vect)):
        print(vect[i])

def merge_sort(vect):
    left = []
    right = []

    result = []
    for i in range(0, int(len(vect)/2)):
        left.append(vect[i])
    for i in range(int(len(vect)/2), len(vect)):
        right.append(vect[i])

    left.sort();
    right.sort();
    i = 0
    j = 0

    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    if i < len(left):
        result.extend(left[i:])
    else:
        result.extend(right[j:])

    print(len(result))
    return result

vect = [3, 1, 5, 7, 10, 2, 0]

vect = merge_sort(vect)
print vect
def打印列表(vect):
对于范围(0,len(vect))中的i:
打印(向量[i])
def合并_排序(矢量):
左=[]
右=[]
结果=[]
对于范围(0,int(len(vect)/2)内的i:
左.追加(向量[i])
对于范围内的i(int(len(vect)/2),len(vect)):
右。追加(向量[i])
left.sort();
对。排序();
i=0
j=0
而i
如果离开[我]我不明白为什么我需要在这段时间结束时添加这个。但是它不起作用…我调整了答案,使之更明确一点。也许它现在对你有用。我不明白为什么以及我需要扩展什么才能让它生效。。。你能用文字告诉我你对新代码行做了什么吗?extend方法以列表作为参数。它迭代列表,并将每个元素附加到类似于父列表的对象。我在上面所做的是获取每个列表的剩余部分(使用列表切片表示法[I:]或[j:]),然后将所有剩余元素添加到结果列表中。如果不是递归的,这可以被视为真正的合并排序吗?从技术上讲,您对left.sort()和right.sort()的调用应该回调用MergeSort,我错了吗?我不明白为什么我需要在while末尾添加这个。但是它不起作用…我调整了答案,使之更明确一点。也许它现在对你有用。我不明白为什么以及我需要扩展什么才能让它生效。。。你能用文字告诉我你对新代码行做了什么吗?extend方法以列表作为参数。它迭代列表,并将每个元素附加到类似于父列表的对象。我在上面所做的是获取每个列表的剩余部分(使用列表切片表示法[I:]或[j:]),然后将所有剩余元素添加到结果列表中。如果不是递归的,这可以被视为真正的合并排序吗?从技术上讲,您对left.sort()和right.sort()的调用应该会调用MergeSort,我错了吗?@user1392136:是的,所以当I>=len(左)或j>=len(右)时,它会中断。另一个指数可能仍然会更低。所以答案是我需要或代替,然后。。如果我尝试使用或,我收到的索引超出范围…@user1392136:否,答案是您需要和,并且您需要在whileah之后添加left或right的未查看部分。。我理解。。非常感谢。还有一件事,如果我调用left=merge\u sort(left),我收到的递归深度超过了最大值。@user1392136:我已经对这个问题做了解释,您以前对答案的评论也做了解释。只要检查数组的大小是否为1,就可以在该点停止递归。@user1392136:是的,因此当i>=len(左)或j>=len(右)时,它将中断。另一个指数可能仍然会更低。所以答案是我需要或代替,然后。。如果我尝试使用或,我收到的索引超出范围…@user1392136:否,答案是您需要和,并且您需要在whileah之后添加left或right的未查看部分。。我理解。。非常感谢。还有一件事,如果我调用left=merge\u sort(left),我已经收到了