📜  合并排序(1)

📅  最后修改于: 2023-12-03 14:50:40.184000             🧑  作者: Mango

合并排序

合并排序(Merge Sort)是一种常用的排序算法,采用分治法的思想,将待排序的列表划分成若干个子列表,直到每个子列表只有一个元素,然后不断合并相邻的子列表,直到最终排序完成。

算法思路

合并排序的算法思路如下:

  1. 将待排序的列表划分成两个子列表,分别对这两个子列表进行合并排序。
  2. 递归执行上一步骤,直到子列表只有一个元素。
  3. 将相邻的子列表进行合并,得到新的有序列表。
  4. 重复上一步骤,直到所有子列表都合并完成,得到最终的有序列表。
算法实现

合并排序的实现代码如下所示:

def merge_sort(lst):
    if len(lst) <= 1:
        return lst
    
    mid = len(lst) // 2
    left_half = lst[:mid]
    right_half = lst[mid:]
    
    left_half = merge_sort(left_half)
    right_half = merge_sort(right_half)
    
    return merge(left_half, right_half)

def merge(left_half, right_half):
    merged = []
    i = j = 0
    
    while i < len(left_half) and j < len(right_half):
        if left_half[i] < right_half[j]:
            merged.append(left_half[i])
            i += 1
        else:
            merged.append(right_half[j])
            j += 1
    
    merged += left_half[i:]
    merged += right_half[j:]
    
    return merged
算法分析

合并排序的时间复杂度为O(nlogn),其中n为待排序列表的长度。这是由于每次划分都将列表分为两个子列表,需要进行logn次划分,而每次合并都需要遍历n个元素,因此总的时间复杂度为nlogn。

合并排序的空间复杂度为O(n),其中n为待排序列表的长度。每次划分都会产生logn个子列表,而在合并的过程中需要使用一个新的列表来存储合并结果,因此需要额外的O(n)空间。

总结

合并排序是一种高效的排序算法,具有稳定性和可扩展性的特点。它采用分治法的思想,通过不断划分和合并子列表来实现排序。合并排序的时间复杂度为O(nlogn),空间复杂度为O(n)。在实际应用中,合并排序常用于对大规模数据进行排序。