我已经写了两个不同的mergesort算法实现,只有一个区别,就是用于找到数组中间点来划分它的公式。
首次实施:(正确运行)
def mergesort(arr):
start = 0
end = len(arr) - 1
if len(arr) > 1:
mid = int(len(arr)/2)
left = mergesort(arr[:mid])
right = mergesort(arr[mid:])
return merge(left,right)
else:
return arr
def merge(left,right):
final = []
while len(left) > 0 or len(right) > 0:
if len(left) > 0 and len(right) > 0:
if left[0] < right[0]:
final.append(left[0])
del left[0]
elif right[0] < left[0]:
final.append(right[0])
del right[0]
elif len(right) > 0:
final.extend(right)
right = []
elif len(left) > 0:
final.extend(left)
left = []
return final
arr = list(map(int,input().split(' ')))
print ("List before sorting:",arr)
final = mergesort(arr)
print ("After sorting:",final)
第二个实现(进入无限循环):
def mergesort(arr):
start = 0
end = len(arr) - 1
if len(arr) > 1:
mid = int(start + (end - start)/2)
left = mergesort(arr[:mid])
right = mergesort(arr[mid:])
return merge(left,right)
else:
return arr
def merge(left,right):
final = []
while len(left) > 0 or len(right) > 0:
if len(left) > 0 and len(right) > 0:
if left[0] < right[0]:
final.append(left[0])
del left[0]
elif right[0] < left[0]:
final.append(right[0])
del right[0]
elif len(right) > 0:
final.extend(right)
right = []
elif len(left) > 0:
final.extend(left)
left = []
return final
arr = list(map(int,input().split(' ')))
print ("List before sorting:",arr)
final = mergesort(arr)
print ("After sorting:",final)
我已经看到了快速排序算法中使用的第二个公式。问题是我的目标是分割数组(如快速排序的情况)为什么它会进入无限循环。
我非常困惑,无法得出任何合理的结论。
有人可以对此事提出一些看法吗?非常感谢。
答案 0 :(得分:0)
使用单个数组而不是子数组的多个实例时,应使用第二种方法。原始数组不是使用实际的单独子数组,而是通过索引范围拆分为逻辑子数组。 mergesort函数将采用3个参数,mergesort(arr,start,end),调用者将调用mergesort(arr,0,len(arr))。合并函数将采用4个参数,合并(arr,start,mid,end)。
使用带有一个参数mergesort(arr)的入口函数可以提高效率。它将分配一个工作数组tmp并将其传递给内部函数,来自mergesort(arr)的调用将是mergesort(arr,tmp,0,len(arr))。 mergesort函数将是mergesort(arr,tmp,start,end)。合并函数将合并(arr,tmp,start,mid,end)。