📜  合并排序与快速排序 (1)

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

合并排序与快速排序

简介

合并排序和快速排序都是常见的排序算法,它们的时间复杂度均为O(nlogn)。

合并排序是一种典型的分治型算法,它将待排序的数组划分成若干个子数组,分别进行排序后再将它们合并成一个完整的有序数组。

快速排序也是一种分治型算法,它选定一个基准元素,将待排序数组分为两部分,左边部分的元素都小于基准元素,右边部分的元素都大于基准元素,然后对左右两部分进行递归排序。

合并排序
def merge_sort(nums):
    if len(nums) <= 1:
        return nums
    mid = len(nums) // 2
    left = merge_sort(nums[:mid])
    right = merge_sort(nums[mid:])
    return merge(left, right)

def merge(left, right):
    res = []
    i = j = 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            res.append(left[i])
            i += 1
        else:
            res.append(right[j])
            j += 1
    res += left[i:]
    res += right[j:]
    return res

merge_sort函数通过递归将待排序数组划分成左右两部分,分别调用merge_sort函数进行排序,然后将左右两部分进行合并,返回一个有序的数组。

merge函数将左右两个有序数组合并成一个有序数组。

快速排序
def quick_sort(nums):
    if len(nums) <= 1:
        return nums
    pivot = nums[0]
    left = [x for x in nums[1:] if x < pivot]
    right = [x for x in nums[1:] if x >= pivot]
    return quick_sort(left) + [pivot] + quick_sort(right)

quick_sort函数通过选定一个基准元素pivot,将数组划分成左右两部分,将小于等于pivot的元素放入左边,大于pivot的元素放入右边,然后对左右两部分进行递归排序。

总结

合并排序和快速排序都是基于分治思想的排序算法,它们的时间复杂度均为O(nlogn)。在实际应用中,快速排序一般比合并排序更快,但在某些特定情况下,合并排序可能会更优。