返回

前端之算法(三):归并排序的神秘面纱

前端

揭秘归并排序:高效稳定的排序利器

什么是归并排序?

归并排序是一种基于分而治之思想的排序算法。它将待排序数组划分为较小的子数组,分别对这些子数组进行排序,最后将排序后的子数组合并成一个排序后的完整数组。

归并排序的工作原理

1. 分解: 将数组一分为二,得到两个较小的子数组。

2. 征服: 对两个子数组分别进行归并排序。

3. 合并: 将排好序的子数组合并成一个排好序的大数组。

归并排序代码示例

def merge_sort(arr):
    """
    归并排序函数
    :param arr: 待排序数组
    :return: 排序后的数组
    """
    n = len(arr)
    if n <= 1:
        return arr

    mid = n // 2  # 计算中点
    left = merge_sort(arr[:mid])  # 对左半部分排序
    right = merge_sort(arr[mid:])  # 对右半部分排序
    return merge(left, right)  # 合并排序后的左右半部分

def merge(left, right):
    """
    合并两个有序数组
    :param left: 排序后的左半部分
    :param right: 排序后的右半部分
    :return: 合并后的有序数组
    """
    i = 0  # 左半部分索引
    j = 0  # 右半部分索引
    merged = []  # 合并后的数组

    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            merged.append(left[i])
            i += 1
        else:
            merged.append(right[j])
            j += 1

    while i < len(left):
        merged.append(left[i])
        i += 1

    while j < len(right):
        merged.append(right[j])
        j += 1

    return merged

归并排序的性能

归并排序具有以下性能特征:

  • 时间复杂度: O(n log n)
  • 空间复杂度: O(n)
  • 稳定性: 稳定(相同元素的相对顺序保持不变)

归并排序的优点和缺点

优点:

  • 稳定的排序算法
  • 时间复杂度不受数组顺序影响
  • 分治思想,易于理解和实现

缺点:

  • 空间复杂度为O(n)
  • 对于较小的数组,效率不如冒泡排序或插入排序

归并排序的应用

归并排序在以下场景中有着广泛的应用:

  • 对大数组进行排序
  • 对稳定性要求较高的场景
  • 排序时间复杂度不受数组顺序影响的场景

常见问题解答

1. 什么是归并排序中的分治思想?
归并排序将大问题分解成较小的子问题,分别解决后再合并得到最终结果。

2. 归并排序的稳定性是什么意思?
稳定性意味着相同元素在排序后的数组中保持相对顺序不变。

3. 归并排序与快速排序有什么区别?
归并排序是稳定的排序算法,时间复杂度为O(n log n);快速排序是非稳定的排序算法,时间复杂度为O(n log n),但常数因子较小。

4. 为什么归并排序的空间复杂度为O(n)?
归并排序需要额外的空间来保存排序后的数组,因此空间复杂度为O(n)。

5. 归并排序适用于哪些场景?
归并排序适用于需要稳定性、时间复杂度不受数组顺序影响的大数组排序场景。