返回

带图归纳理解:归并排序的思想、过程与代码实现

见解分享

归纳理解归并排序

归并排序被广泛认可为一种高效的排序算法,以其时间复杂度为O(nlogn)的稳定表现而被很多程序员熟知。那么,它背后的思想是怎样的呢?如何一步步用代码去实现呢?

归并排序的三步走:

  • 归:将一个无序列表分成相等或者近似相等的两部分,对每一部分进行排序,然后将排好序的两个子列表合并为一个列表。
  • 并:先将数组分成左右两部分,对这两部分分别进行递归排序,然后将排好序的左右两部分合并成一个整体。
  • 排:通过递归,直到各组序列只有0或者1个元素,再分别合并为一个有序序列。

归并排序代码解析:

def merge_sort(array):
  # 如果数组长度为1,则数组有序
  if len(array) <= 1:
    return array

  # 将数组分成左右两部分
  middle = len(array) // 2
  left_array = array[:middle]
  right_array = array[middle:]

  # 对左右两部分分别进行递归排序
  left_array = merge_sort(left_array)
  right_array = merge_sort(right_array)

  # 合并排好序的左右两部分
  return merge(left_array, right_array)


def merge(left_array, right_array):
  # 创建一个空列表来保存排好序的数组
  merged_array = []

  # 创建两个指针,分别指向左右两个数组的开头
  left_index = 0
  right_index = 0

  # 将左右两个数组中的元素逐个比较,并将较小的元素添加到合并后的数组中
  while left_index < len(left_array) and right_index < len(right_array):
    if left_array[left_index] <= right_array[right_index]:
      merged_array.append(left_array[left_index])
      left_index += 1
    else:
      merged_array.append(right_array[right_index])
      right_index += 1

  # 将左右两个数组中剩余的元素添加到合并后的数组中
  merged_array.extend(left_array[left_index:])
  merged_array.extend(right_array[right_index:])

  # 返回排好序的数组
  return merged_array

实战演示:

代码中的关键步骤为:

  • middle = len(array) // 2
    left_array = array[:middle]
    right_array = array[middle:]
    

将数组分成左右两部分

  • left_array = merge_sort(left_array)
    right_array = merge_sort(right_array)
    

对左右两部分分别进行递归排序

  • return merge(left_array, right_array)
    

合并排好序的左右两部分

例子:

>>> array = [10, 7, 8, 9, 1, 5]
>>> sorted_array = merge_sort(array)
>>> print(sorted_array)
[1, 5, 7, 8, 9, 10]

归并排序是一种思想清晰、运用广泛的算法,学习和掌握它有助于巩固对排序算法的认识,进而对算法和程序设计有更深入的理解。