📜  DAA-合并排序(1)

📅  最后修改于: 2023-12-03 15:00:19.660000             🧑  作者: Mango

DAA-合并排序

合并排序是一种分治算法,它将一个大问题分解成多个小问题,并通过递归调用自身来解决这些小问题。合并排序算法的核心思想是将待排序序列分成两个子序列,对每个子序列进行排序,然后将它们合并成一个有序序列。

算法步骤

合并排序的基本步骤如下:

  1. 将待排序序列平均分成两个子序列,直到序列中只有一个元素。
  2. 对左右两个子序列进行递归的合并排序。
  3. 合并左右两个子序列,生成一个有序序列。

其中,合并两个有序序列的方法是:维护两个指针,分别指向左右两个子序列的开头,比较两个指针指向的元素,将较小的元素加入到结果序列中,同时将指针向后移动一位,直到其中一个子序列为空。此时将另一个子序列中剩余的元素加入到结果序列中即可。

代码示例

下面是一个 Python 实现的合并排序算法示例:

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2
        left_arr = arr[:mid]
        right_arr = arr[mid:]
        merge_sort(left_arr)
        merge_sort(right_arr)
        
        i = j = k = 0
        while i < len(left_arr) and j < len(right_arr):
            if left_arr[i] < right_arr[j]:
                arr[k] = left_arr[i]
                i += 1
            else:
                arr[k] = right_arr[j]
                j += 1
            k += 1
            
        while i < len(left_arr):
            arr[k] = left_arr[i]
            i += 1
            k += 1
            
        while j < len(right_arr):
            arr[k] = right_arr[j]
            j += 1
            k += 1
    return arr
时间复杂度

合并排序的时间复杂度为 O(nlogn),其中 n 是待排序序列的长度。在最坏情况下,合并排序的空间复杂度为 O(n)。由于合并排序的空间复杂度比较高,因此在应用时需要考虑较多。