算法与Python

算法与Python 知识量:10 - 40 - 100

10.2 归并排序><

递归法与迭代法- 10.2.1 -

归并算法有两种类型:递归法(Top-down)和迭代法(Bottom-up)。

  • 递归法(Top-down):这种方法从最高级别开始,将问题分解为子问题,然后解决这些子问题。一旦子问题被解决,它们的解被合并以解决原始问题。这种方法也被称为自上而下的方法。

  • 迭代法(Bottom-up):这种方法从问题的基本部分开始,通过逐步合并这些部分来解决整个问题。这种方法也被称为自下而上的方法。

在归并排序中,递归法通常是这样的:

  1. 分解:将数组分解成两个较小的子数组,直到每个子数组只包含一个元素。

  2. 解决:独立地对子数组进行排序。

  3. 合并:通过逐一合并已排序的子数组合并成完整的排序数组。

而迭代法通常是这样的:

  1. 初始化:创建两个子数组,左半部分和右半部分,分别包含原数组的所有元素。

  2. 合并:从左到右逐一合并两个子数组,直到所有元素都被合并到一个排序数组中。

这两种方法都可以有效地实现归并排序,但递归法在概念上可能更容易理解。然而,对于大型数据集,迭代法可能更高效,因为它避免了递归调用的开销。

迭代法的实现- 10.2.2 -

以下是一个使用迭代法实现的归并排序的Python代码示例:

def merge_sort_iterative(arr):  
    n = len(arr)  
    for i in range(n // 2):  
        # 初始化左右两个子数组  
        left = arr[:n // 2]  
        right = arr[n // 2:]  
          
        # 合并左右两个子数组  
        merge(left, right)  
          
        # 将合并后的数组赋值给原数组  
        arr[:] = left  
          
    return arr  
  
def merge(left, right):  
    i = j = 0  
    while i < len(left) and j < len(right):  
        if left[i] <= right[j]:  
            left.append(left[i])  
            i += 1  
        else:  
            left.append(right[j])  
            j += 1  
    while i < len(left):  
        left.append(left[i])  
        i += 1  
    while j < len(right):  
        left.append(right[j])  
        j += 1

这个实现使用迭代法,通过逐步合并子数组来对数组进行排序。在主函数中,首先将数组分成左右两个子数组,然后调用merge函数将它们合并为一个排序数组。在merge函数中,通过比较左右子数组的元素并将它们插入到正确的位置,最终得到一个排序数组。最后,将排序后的数组赋值给原数组。