我试图用Python编写一个merge sort函数,它接受一个列表和一个比较函数:
def sort(unsorted, comp_func=lambda x, y: x < y):
length = len(unsorted)
if length <= 1: return unsorted
halflen = length / 2
lsorted= sort(unsorted[:halflen])
rsorted = sort(unsorted[halflen:])
combined = []
while True:
if len(lsorted) > 0:
if len(rsorted) > 0 and comp_func(rsorted[0], lsorted[0]):
combined.append(rsorted[0])
rsorted = rsorted[1:]
else:
combined.append(lsorted[0])
lsorted = lsorted[1:]
elif len(rsorted) > 0:
combined.append(rsorted[0])
rsorted = rsorted[1:]
else:
break
return combined
它可以很好地处理int的列表(使用默认的comp_func),以及比较函数比较此类元组的第一个元素时具有2int的元组列表。在
^{pr2}$但是当我编写比较函数来比较元组的第二个元素时,返回的列表仍然是未排序的版本。在
comp_func = lambda x, y: x[1] < y[1]
但是,如果我将“<;”运算符更改为“>;”,以便对列表进行递减排序,则可以:
comp_func = lambda x, y: x[1] > y[1]
不知道为什么在元组的第二个元素上“<;”失败。。。在
在寻找了一个可能的解释后,我发现了这个:Does python think 10 is less than 9。然而,情况并非如此;正在排序的列表包含int的元组,而不是string。在
实际上,您并没有显示您如何更改运算符的记录,所以这只是一个猜测,但是请注意这两行代码
不要超过补偿功能。如果你这样做:
^{pr2}$你会得到不一致的结果,因为有一半的时间它是用不同的comp_func排序的。在
lsorted=
和rsorted=
行中传递comp\u func可以修复此问题:相关问题 更多 >
编程相关推荐