python中排序算法时间复杂度优化样例

目录

一、低效率的算法:冒泡排序

二、优化后的算法:快速排序

三 优化算法说明:

优化算法的详细解释

比较与优化


一、低效率的算法:冒泡排序

冒泡排序是一种简单但效率较低的排序算法。它的时间复杂度为 𝑂(𝑛2)O(n2),在处理大规模数据时性能非常差。

def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]

# 示例数组
arr = [64, 34, 25, 12, 22, 11, 90]

# 执行冒泡排序
bubble_sort(arr)

print("Sorted array is:", arr)

二、优化后的算法:快速排序

快速排序(QuickSort)是一种效率较高的排序算法,通常采用分治法来实现。它的平均时间复杂度为 𝑂(𝑛log⁡𝑛)O(nlogn),在大多数情况下比冒泡排序要快得多。

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x < pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x > pivot]
    return quick_sort(left) + middle + quick_sort(right)

# 示例数组
arr = [64, 34, 25, 12, 22, 11, 90]

# 执行快速排序
sorted_arr = quick_sort(arr)

print("Sorted array is:", sorted_arr)

三 优化算法说明:

优化算法的详细解释
  1. 选择一个基准点(Pivot):选择数组的中间元素作为基准点。
  2. 分割数组:将数组分割成三个部分:
    • 小于基准点的元素
    • 等于基准点的元素
    • 大于基准点的元素
  3. 递归排序:对小于基准点和大于基准点的部分分别进行快速排序。
  4. 合并结果:将排序后的三个部分合并,得到最终的排序数组。
比较与优化
  • 冒泡排序:每次都需要比较相邻元素,并交换位置,最坏情况下需要进行 𝑛2n2 次比较和交换。
  • 快速排序:通过选择基准点,将数组分割成较小的子数组,然后递归排序。这种分治法大大减少了比较和交换的次数。

性能对比

  • 时间复杂度
    • 冒泡排序:𝑂(𝑛2)O(n2)
    • 快速排序:平均情况下 𝑂(𝑛log⁡𝑛)O(nlogn)
  • 空间复杂度
    • 冒泡排序:𝑂(1)O(1)(原地排序)
    • 快速排序:𝑂(log⁡𝑛)O(logn)(递归调用栈空间)
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
问题描述: 有n个男运动员和n个女运动员,每个男运动员都有一个能力值,每个女运动员也有一个能力值。要求按照男女配对,使得所有配对的运动员,能力值总和最大的最小。 问题分析: 这是一个经典的最大权匹配问题,可以使用搜索法进行求解。首先,可以对男女运动员按照能力值从大到小进行排序,然后从能力值最大的男运动员开始,依次尝试与每个女运动员进行配对。如果当前男运动员与某个女运动员配对后能力值总和超过了之前的最大值,就更新最大值,并继续向下搜索。如果当前男运动员与所有女运动员都配对失败,就回溯到上一个男运动员,并尝试与下一个女运动员进行配对。 算法描述: 1. 对男女运动员按照能力值从大到小进行排序。 2. 从能力值最大的男运动员开始,依次尝试与每个女运动员进行配对。 3. 如果当前男运动员与某个女运动员配对后能力值总和超过了之前的最大值,就更新最大值,并继续向下搜索。 4. 如果当前男运动员与所有女运动员都配对失败,就回溯到上一个男运动员,并尝试与下一个女运动员进行配对。 5. 直到所有男运动员都尝试过与所有女运动员的配对,或者当前能力值总和已经小于等于之前的最大值。 输入样: ``` n = 3 male_abilities = [5, 3, 2] female_abilities = [3, 2, 1] ``` 输出样: ``` 6 ``` 程序代码: ```python def max_weight_matching(male_abilities, female_abilities): n = len(male_abilities) male_abilities.sort(reverse=True) female_abilities.sort(reverse=True) max_weight = 0 def dfs(male_idx, weight): nonlocal max_weight if male_idx == n: max_weight = max(max_weight, weight) return if weight + (n - male_idx) * (male_abilities[male_idx] + female_abilities[0]) <= max_weight: return for female_idx in range(n): if female_abilities[female_idx] == -1: continue new_weight = weight + male_abilities[male_idx] + female_abilities[female_idx] female_abilities[female_idx] = -1 dfs(male_idx+1, new_weight) female_abilities[female_idx] = new_weight - male_abilities[male_idx] dfs(0, 0) return max_weight n = 3 male_abilities = [5, 3, 2] female_abilities = [3, 2, 1] print(max_weight_matching(male_abilities, female_abilities)) # 输出 6 ``` 时间复杂度分析: 由于搜索过程,每个男运动员最多只能尝试与n个女运动员进行配对,因此总时间复杂度为O(n^n)。但是通过剪枝操作可以减少搜索次数,降低时间复杂度。 优化改进: 可以使用匈牙利算法等其他更高效的算法进行求解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

谷隐凡二

相识便是缘,开启技术大门

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

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

打赏作者

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

抵扣说明:

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

余额充值