Buggy合并排序实现

时间:2018-09-29 20:15:14

标签: python-3.x algorithm

由于我在调用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)。快速排序是否比合并排序更受青睐?

2 个答案:

答案 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(herehere)上已经有答案了。