Python列表赋值没有任何效果

Python列表赋值没有任何效果,python,arrays,Python,Arrays,我对Python比较陌生 我试图在python中实现合并排序。然而,像[1,2,6,4,5]这样的测试用例在“排序”时显示为[1,1,1,1,1],经过很长时间,我发现原因在于合并算法。实际的算法看起来不错,只是我不知道为什么某个部分不起作用 def merge(arr, left, right, start_pos): i = 0 j = 0 k = start_pos while i < len(left) or j < len(right):

我对Python比较陌生

我试图在python中实现合并排序。然而,像[1,2,6,4,5]这样的测试用例在“排序”时显示为[1,1,1,1,1],经过很长时间,我发现原因在于合并算法。实际的算法看起来不错,只是我不知道为什么某个部分不起作用

def merge(arr, left, right, start_pos):
   i = 0
   j = 0
   k = start_pos

   while i < len(left) or j < len(right):
       if i >= len(left):
           arr[k] = right[j] # This assignment has no effect
           j += 1
           k += 1
       elif j >= len(right):
           arr[k] = left[i] # Same here
           i += 1
           k += 1
       else:
           if arr[i] < arr[j]:
               arr[k] = arr[i] # Here
               i += 1
               k += 1
           else:
               arr[k] = arr[j] # And here
               j += 1
               k += 1

您对
merge
函数的调用似乎是罪魁祸首,您在同一列表中传递了
arr
3次


您可能希望
merge
函数返回一个新列表,该列表是
left
right
的合并输出。这也将帮助您更清楚地看到
merge\u helper
中的递归

您调用
merge
函数似乎是罪魁祸首,您在同一列表中传递了3次
arr


您可能希望
merge
函数返回一个新列表,该列表是
left
right
的合并输出。这也将帮助您更清楚地看到
merge\u helper
中的递归

合并函数旨在按左排序列表和右排序列表生成新的排序列表。 如果arr[i],则错误发生在
。
您不希望比较arr[i]和arr[j],比较值应为left[i]和right[j],选择较小的值填充到arr

这是修改后的代码

def merge_sort(arr):
    merge_sort_helper(arr, 0, len(arr))

def merge_sort_helper(arr, left, right):
    if left >= right - 1:
        return

    mid = int((left + right) / 2)
    merge_sort_helper(arr, left, mid)
    merge_sort_helper(arr, mid, right)
    merge(arr, arr[left : mid], arr[mid : right], left)


def merge(arr, left, right, start_pos):
   i = 0
   j = 0
   k = start_pos

   while i < len(left) or j < len(right):
       if i >= len(left):
           arr[k] = right[j]
           j += 1
           k += 1
       elif j >= len(right):
           arr[k] = left[i]
           i += 1
           k += 1
       else:
           if left[i] < right[j]:
               arr[k] = left[i]
               i += 1
               k += 1
           else:
               arr[k] = right[j]
               j += 1
               k += 1

l = [8,1,3,5,7,6,4,2,9]
merge_sort(l)
print(l)
def merge_sort(arr):
合并\排序\辅助程序(arr、0、len(arr))
def合并\排序\辅助程序(arr、左、右):
如果左>=右-1:
返回
中间=整数((左+右)/2)
合并\排序\辅助对象(arr、左、中)
合并\排序\辅助对象(arr,中,右)
合并(arr、arr[左:中]、arr[中:右]、左)
def合并(arr、左、右、启动位置):
i=0
j=0
k=开始位置
当i=len(左):
arr[k]=右[j]
j+=1
k+=1
elif j>=len(右):
arr[k]=左[i]
i+=1
k+=1
其他:
如果左[i]<右[j]:
arr[k]=左[i]
i+=1
k+=1
其他:
arr[k]=右[j]
j+=1
k+=1
l=[8,1,3,5,7,6,4,2,9]
合并排序(l)
印刷品(l)

合并函数旨在按左排序列表和右排序列表生成新的排序列表。 如果arr[i]
,则错误发生在
。
您不希望比较arr[i]和arr[j],比较值应为left[i]和right[j],选择较小的值填充到arr

这是修改后的代码

def merge_sort(arr):
    merge_sort_helper(arr, 0, len(arr))

def merge_sort_helper(arr, left, right):
    if left >= right - 1:
        return

    mid = int((left + right) / 2)
    merge_sort_helper(arr, left, mid)
    merge_sort_helper(arr, mid, right)
    merge(arr, arr[left : mid], arr[mid : right], left)


def merge(arr, left, right, start_pos):
   i = 0
   j = 0
   k = start_pos

   while i < len(left) or j < len(right):
       if i >= len(left):
           arr[k] = right[j]
           j += 1
           k += 1
       elif j >= len(right):
           arr[k] = left[i]
           i += 1
           k += 1
       else:
           if left[i] < right[j]:
               arr[k] = left[i]
               i += 1
               k += 1
           else:
               arr[k] = right[j]
               j += 1
               k += 1

l = [8,1,3,5,7,6,4,2,9]
merge_sort(l)
print(l)
def merge_sort(arr):
合并\排序\辅助程序(arr、0、len(arr))
def合并\排序\辅助程序(arr、左、右):
如果左>=右-1:
返回
中间=整数((左+右)/2)
合并\排序\辅助对象(arr、左、中)
合并\排序\辅助对象(arr,中,右)
合并(arr、arr[左:中]、arr[中:右]、左)
def合并(arr、左、右、启动位置):
i=0
j=0
k=开始位置
当i=len(左):
arr[k]=右[j]
j+=1
k+=1
elif j>=len(右):
arr[k]=左[i]
i+=1
k+=1
其他:
如果左[i]<右[j]:
arr[k]=左[i]
i+=1
k+=1
其他:
arr[k]=右[j]
j+=1
k+=1
l=[8,1,3,5,7,6,4,2,9]
合并排序(l)
印刷品(l)

列表分配语句按预期工作。问题在于您分配给该列表的值。请将其减少并增强为预期值。显示中间结果与预期结果的偏差。特别是,输入一些战略性的
print
命令,以显示排序过程中实际发生的情况。我看不出赋值不起作用,因为您忽略了向我们展示。最让我困惑的是,您希望如何将分配给临时局部变量的值准确地传输回主列表。我认为您不太了解哪些参数是瞬态的,哪些映射到主程序中的变量(您忽略了提供或跟踪这些变量)。list赋值语句按预期工作。问题在于您分配给该列表的值。请将其减少并增强为预期值。显示中间结果与预期结果的偏差。特别是,输入一些战略性的
print
命令,以显示排序过程中实际发生的情况。我看不出赋值不起作用,因为您忽略了向我们展示。最让我困惑的是,您希望如何将分配给临时局部变量的值准确地传输回主列表。我认为您不太了解哪些参数是瞬态的,哪些映射到主程序中的变量(您忽略了提供或跟踪)。谢谢,我没有注意到那个错误。谢谢,我没有注意到那个错误。