由于我在调用merge之前没有得到两个排序列表,因此我的归类排序实现存在问题。我不确定它到底出了什么问题。
def mergeSort(arr):
if len(arr) == 1 : return arr
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]
mergeSort(left_half)
mergeSort(right_half)
return merge(left_half,right_half)
def merge(list1,list2):
res = []
i = 0
j = 0
while i < len(list1) and j < len(list2):
if list1[i] < list2[j]:
res.append(list1[i])
i += 1
elif list1[i] > list2[j]:
res.append(list2[j])
j += 1
#Add remaining to res if any
while i < len(list1):
res.append(list1[i])
i += 1
while j < len(list2):
res.append(list2[j])
j += 1
return res
A = [5,1,2,15]
print(mergeSort(A))
我对合并排序的理解是,由于内存中有n个项目(在最终合并中),所以空间复杂度为O(n)。快速排序是否比合并排序更受青睐?
答案 0 :(得分:3)
我不是python专家,但您应该写
left_half = arr[:mid]
right_half = arr[mid:]
left_half = mergeSort(left_half)
right_half = mergeSort(right_half)
因为您的mergeSort返回排序数组的副本。
答案 1 :(得分:2)
您的代码中有3个错误。
首先是您不处理空白列表。您需要在第二行中使用<=
而不是==
。
第二个原因是,您只需调用mergeSort(left_half)
就可以将left_half
“按引用”排序,而不是(与right_half
相同)。
第三,在list1[i] == list2[j]
情况下,您什么也不做。实际上,您不需要那个elif
,您只需要一个else
。不论是否附加list1[i]
或list2[j]
都没关系,但是必须附加两者之一。
您的代码应为:
def mergeSort(arr):
if len(arr) <= 1 : return arr
mid = len(arr) // 2
left_half = mergeSort(arr[:mid])
right_half = mergeSort(arr[mid:])
return merge(left_half, right_half)
def merge(list1, list2):
res = []
i = 0
j = 0
while i < len(list1) and j < len(list2):
if list1[i] < list2[j]:
res.append(list1[i])
i += 1
else:
res.append(list2[j])
j += 1
#Add remaining to res if any
...
关于您对空间复杂性以及与quicksort进行比较的问题,StackOverflow(here和here)上已经有答案了。