数据结构与算法10-排序2

在这里插入图片描述

1.归并排序

在这里插入图片描述

def merge(nums1, nums2):
    i = 0
    j = 0
    res = []
    while i < len(nums1) and j < len(nums2):
        if nums1[i] > nums2[j]:
            res.append(nums2[j])
            j += 1
        else:  # 相等时,先放左边数组的数据,这样才是稳定排序。
            res.append(nums1[i])
            i += 1
    res += nums1[i:]
    res += nums2[j:]
    return res

def merge_sort(lists):
    if len(lists) < 2:  # 归并与快排递归结束条件一致
    # 拆分到单独一个
        return lists
    mid = len(lists)//2
    left = merge_sort(lists[:mid])
    right = merge_sort(lists[mid:])
    return merge(left, right)

在这里插入图片描述
将一段长文本分到最小格,需要logn,而小格排序则需要n,所以归并时间复杂度为nlogn。
在这里插入图片描述

2.快速排序

在这里插入图片描述

def quick_sort(arr):
    """快速排序"""
    if len(arr) < 2:  # 归并与快排递归结束条件一致
    # 如果为1,下面的大部分步骤也不会执行
        return arr
    # 选取基准,随便选哪个都可以,选中间的便于理解
    mid = arr[0]
    # 定义基准值左右两个数列
    left, right = [], []
    # 从原始数组中移除基准值
    for item in arr[1:]:
        # 大于基准值放右边
        if item >= mid:
            right.append(item)
        else:
            # 小于基准值放左边
            left.append(item)
    # 使用迭代进行比较
    return quick_sort(left) + [mid] + quick_sort(right)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意快排的思想和实现方法的区别。

3.归并、快排对比

在这里插入图片描述

4.拓展- Top K 问题使用快排思路 O(n) - 重要

在这里插入图片描述
在这里插入图片描述
q = 1 / 2 q=1/2 q=1/2,等比数列求和,当n很大的时候, q n q^n qn相当于木有了,所以最后是2n-1。
在这里插入图片描述
在这里插入图片描述

5.小结

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xu_Wave

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值