Python:我无法获得正确的合并排序
我编写了以下程序;运行后,结果不正确。 那么我的代码有什么问题Python:我无法获得正确的合并排序,python,recursion,Python,Recursion,我编写了以下程序;运行后,结果不正确。 那么我的代码有什么问题 def mergesort(list1): if len(list1) > 1: mid = len(list1) // 2 left_list = list1[:mid] right_list = list1[mid:] mergesort(left_list) mergesort(right_list) i = 0 # left
def mergesort(list1):
if len(list1) > 1:
mid = len(list1) // 2
left_list = list1[:mid]
right_list = list1[mid:]
mergesort(left_list)
mergesort(right_list)
i = 0 # left
j = 0 # right
k = 0 # total
while len(list1) > 1 and i < len(left_list) and j < len(right_list):
if left_list[i] < right_list[j]:
list1[k] = left_list[i]
k += 1
i +=1
else:
list1[k] = right_list[i]
k += 1
j += 1
if len(list1) > 1 and i < len(left_list):
list1[k] = left_list[i]
i += 1
k += 1
if len(list1) > 1 and j < len(right_list):
list1[k] = right_list[j]
k += 1
j += 1
return list1
ex = [3, 5, 9, 0, 8, 7]
mergesort(ex)
def合并排序(列表1):
如果len(列表1)>1:
mid=len(列表1)//2
左列表=列表1[:中间]
右列表=列表1[mid:]
合并排序(左列表)
合并排序(右列表)
i=0#左
j=0#对
k=0#总计
而len(列表1)>1和i1且i1且j
结果:[0,3,5,7,7,9]我发现了三个问题
mergesort(左列表)
mergesort(右列表)
获得结果(但这甚至可以工作,因为它会替换原始列表中的值)
i
而不是j
if
istead of,而
def合并排序(列表1):
如果len(列表1)>1:
mid=len(列表1)//2
左列表=列表1[:中间]
右列表=列表1[mid:]
左列表=合并排序(左列表)#1。得到结果
右列表=合并排序(右列表)#1。得到结果
i=0#左
j=0#对
k=0#总计
而len(列表1)>1和i1和i1和j
我发现了三个问题
mergesort(左列表)
mergesort(右列表)
获得结果(但这甚至可以工作,因为它会替换原始列表中的值)
i
而不是j
if
istead of,而
def合并排序(列表1):
如果len(列表1)>1:
mid=len(列表1)//2
左列表=列表1[:中间]
右列表=列表1[mid:]
左列表=合并排序(左列表)#1。得到结果
右列表=合并排序(右列表)#1。得到结果
i=0#左
j=0#对
k=0#总计
而len(列表1)>1和i1和i1和j
合并排序有3个不同的步骤:基本大小写、递归步骤和合并步骤。合并步骤通常作为一个单独的函数编写,但这里我将其合并到merge_sort函数中,以与代码保持一致。您最大的问题是没有将子列表进行递归排序并合并它们
def mergesort(list1):
#base case
if len(list1) <= 1:
return list1
#recursive step
mid = len(list1) // 2
left_list = list1[:mid]
right_list = list1[mid:]
sorted_left = mergesort(left_list)
sorted_right = mergesort(right_list)
#merge step
result = []
while len(sorted_left) > 0 and len(sorted_right) > 0:
if sorted_left[0] <= sorted_right[0]:
result.append(sorted_left.pop(0))
elif sorted_right[0] <= sorted_left[0]:
result.append(sorted_right.pop(0))
else:
result.append(sorted_left.pop(0))
result.append(sorted_right.pop(0))
result = result + sorted_left + sorted_right
return result
print(mergesort([3,5,1,9,7])) #output: [1, 3, 5, 7, 9]
def合并排序(列表1):
#基本情况
如果len(列表1)0和len(排序右)>0:
如果按左[0]排序,则合并排序有3个不同的步骤:基本大小写、递归步骤和合并步骤。合并步骤通常作为一个单独的函数编写,但这里我将其合并到merge_sort函数中,以与代码保持一致。您最大的问题是没有将子列表进行递归排序并合并它们
def mergesort(list1):
#base case
if len(list1) <= 1:
return list1
#recursive step
mid = len(list1) // 2
left_list = list1[:mid]
right_list = list1[mid:]
sorted_left = mergesort(left_list)
sorted_right = mergesort(right_list)
#merge step
result = []
while len(sorted_left) > 0 and len(sorted_right) > 0:
if sorted_left[0] <= sorted_right[0]:
result.append(sorted_left.pop(0))
elif sorted_right[0] <= sorted_left[0]:
result.append(sorted_right.pop(0))
else:
result.append(sorted_left.pop(0))
result.append(sorted_right.pop(0))
result = result + sorted_left + sorted_right
return result
print(mergesort([3,5,1,9,7])) #output: [1, 3, 5, 7, 9]
def合并排序(列表1):
#基本情况
如果len(列表1)0和len(排序右)>0:
如果排序为左[0],最好使用print()
查看代码中不同时刻变量中的值,并将其与纸面计算进行比较。通过这种方式,您可以找到问题所在。此时,我看到一个问题—您运行mergesort(左列表)
和mergesort(右列表)
,但您没有得到结果-result\u left=mergesort(左列表)
和results\u right=mergesort(右列表)
—并且您没有使用它们;最好使用print()
在代码的不同时刻查看变量中的值,并将其与纸上的计算进行比较。通过这种方式,您可以找到问题所在。此时,我看到一个问题—您运行mergesort(左列表)
和mergesort(右列表)
,但您没有得到结果-result\u left=mergesort(左列表)
和results\u right=mergesort(右列表)
—并且您没有使用它们;这很有帮助,你在合并和递归步骤中的设计很棒~~我正在学习。;多谢各位!你在合并和递归步骤中的设计太棒了~~我正在学习。;多谢各位!多谢各位,;我忘了保存结果;然而,它被放在列表1中;也许这不会造成问题;经过一步一步的测试,,