Codecademy归并排序算法

Codecademy Merge sort Algorithm

我目前正在学习使用 Python 进行排序算法的代码学院课程,并且我目前正在学习合并排序。但是,显示的代码似乎与他们显示的图表相矛盾。

def merge_sort(items):
  if len(items) <= 1:
    return items

  middle_index = len(items) // 2
  left_split = items[:middle_index]
  right_split = items[middle_index:]

  left_sorted = merge_sort(left_split)
  right_sorted = merge_sort(right_split)

  return merge(left_sorted, right_sorted)

def merge(left, right):
  result = []

  while (left and right):
    if left[0] < right[0]:
      result.append(left[0])
      left.pop(0)
    else:
      result.append(right[0])
      right.pop(0)

  if left:
    result += left
  if right:
    result += right

  return result

同时,这是反映此遍历的图表:

所以,图表向我展示了列表首先拆分的方式是左侧拆分应该是从开始到 包括 中间索引的所有数字.然而,代码说左拆分应该是从开始到 而不是 的所有数字,包括中间索引。我只是疯了还是这没有意义?就第一次拆分而言,此代码是否与图表相矛盾?

对于图中的例子,

items = [98, 13, 274, 7, 12, 981, 5]

len(items) 将是 7,而 middle_index 将是 7 // 2 = 3,因此

left_split = items[:3] = [98, 13, 274]
right_split = items[3:] = [7, 12, 981, 5]

所以你是对的,代码将在右分割中包含中间元素,而在图像中它包含在左分割中。

然而,这并不意味着代码没有意义,因为 merge 函数相对于 leftright 是对称的,它不假设其中一个列表大于另一个列表;一旦合并过程中任一列表变空,剩余的另一个列表将附加到结果的末尾。

事实上,准确的分割点与排序结果无关,如果它尽可能靠近中间,算法会更有效,因为这会最小化每个分割的两个长度中的较大者。