def merge (l1,l2):
if l1 and l2:
if l1 == [] and l2 == []:
return []
if l1[0] > l2[0]:
l1, l2 = l2, l1
return [l1[0]] + merge(l1[1:], l2)
return l1 + l2
def sort(l):
x = len(l) / 2
x = int(x)
y = merge(l[0:x], l[x+1:])
return y
我需要编写一个名为sort的递归函数;它传递任何无序列表(所有int或所有str)并返回一个新列表,其中包含其参数列表中的每个值,但是按有序/不按降序排列。但我无法调用任何执行排序的Python函数/方法。
另外,对于任何至少有2个值的列表,我必须将列表分成两半并递归调用sort来对每个较小的列表进行排序,我必须使用上面写的merge函数来合并这两个排序列表从这些递归调用中返回
merge是一个组合和排序两个列表
的函数merge([1,3,5,8,12],[2,3,6,7,10,15]) returns [1,2,3,3,5,6,7,8,10,12,15].
例如,调用sort([4,5,3,1,6,7,2])将在列表[4,5,3]和[1,6,7,2]上递归调用sort ,分别返回列表[3,4,5]和[1,2,6,7],合并后将返回列表[1,2,3,4,5,6,7]。
我的功能出现以下错误
39 *Error: sort([1,2,3,4,5,6,7]) -> [1, 2, 3, 5, 6, 7] but should -> [1, 2, 3, 4, 5, 6, 7]
40 *Error: sort([7,6,5,4,3,2,1]) -> [3, 2, 1, 7, 6, 5] but should -> [1, 2, 3, 4, 5, 6, 7]
41 *Error: sort([4,5,3,1,2,7,6]) -> [2, 4, 5, 3, 7, 6] but should -> [1, 2, 3, 4, 5, 6, 7]
42 *Error: sort([1,7,2,6,3,5,4]) -> [1, 3, 5, 4, 7, 2] but should -> [1, 2, 3, 4, 5, 6, 7]
我的排序方法有什么问题?有人可以帮我解决吗?提前致谢。
答案 0 :(得分:2)
三个问题:
y = merge(l[0:x], l[x+1:])
输了l[x]
,将其设为y = merge(l[:x], l[x:])
。y = merge(sort(l[:x]), sort(l[x:]))
。更正并简化了一点:
def sort(l):
if len(l) <= 1:
return l
x = len(l) // 2
return merge(sort(l[:x]), sort(l[x:]))
//
是整数除法,因此您不需要额外的int(...)
。创建y
变量毫无意义。
顺便说一句,if l1 == [] and l2 == []:
内的if l1 and l2:
测试毫无意义(如果l1
和l2
为[]
,则不会进入{{1}首先阻止),所以你可以删除它。
还有一件事:虽然你的if l1 and l2:
功能没有错,但速度很慢。每个merge
需要的时间与l1[1:]
的长度成正比。你最好使用索引,例如在Huy Vo的回答中。
答案 1 :(得分:0)
好吧,基本上你所做的一切都是多余的。
list1 = [1,3,5,8,12]
list2 = [2,3,6,7,10,15]
list3 = list1 + list2 # Merges lists
list3_sorted = sorted(list3) # Sorts them
还有一点奖励,如果你有一个列表或元组列表,你想按每个列表的索引排序
from operator import itemgetter
list = [(2,6), (3,4)]
list_sorted = sorted( list, key=itemgetter(1) ) # Will sort by index 1 of each item.
编辑:我现在意识到你不能使用任何内置函数,给我一点乱七八糟,看看我能不能解决问题
答案 2 :(得分:0)
你需要的是合并排序,我相信互联网上有多个合并排序伪代码。
无论如何,这是我在Python 3中的一个版本:
def mergesort(lst):
if len(lst) < 2:
return lst
else:
middle = len(lst) // 2
# recursion, baby
left_half = mergesort(lst[:middle])
right_half = mergesort(lst[middle:])
return merge(left_half, right_half)
def merge(left, right):
result = []
i, j = 0, 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i += 1
elif left[i] > right[j]:
result.append(right[j])
j += 1
result += left[i:] + right[j:]
return result