Python——排序(冒泡、选择、插入、快速、堆..) 时间复杂度 (个人向)

本文介绍了排序算法的时间复杂度和大O表示法,详细讲解了冒泡排序、选择排序、直接插入排序和快速排序的思路,并提到了堆排序的概念和操作。这些排序算法在Python中的应用广泛,理解其工作原理对于优化代码性能至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、时间复杂度

将程序执行的计算步骤的总和叫做时间复杂度
时间复杂度实际上用来描述算法时间效率

例:如T(n)=n2+5n+6与T(n)=4n2+2n+1它们的频度不同,但时间复杂度相同,都为O(n2)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。
总结:大O表示法就是将一个T(n)时间复杂度的系数去掉只留下最特征的部分就是大O表示法。
引用:
在这里插入图片描述

二、排序

常用排序:
冒泡排序 - (交换排序) 快速排序 - (交换排序)
选择排序 - (选择排序)、堆排序 - (选择排序)
直接插入排序 - (插入排序)、希尔排序 - (插入排序)、
(归并排序、、桶/基数排序)
——————————————
冒泡排序
思路:
1.重复遍历要排序的数列n个元素,一次比较相邻两个元素 一次比较,保证
右边的元素始终大于左边
的元素;
(第一轮结束后,数列中最后一个元素一定是当前数列中最大值)
2.对数列当中剩下的n-1个元素,再次执行步骤1
3.对于长度为n的数列,一共需要执行n-1次轮的比较

"""冒泡排序"""
def bubble_sort(lst):
    for i in range(len(lst) - 1):
        for j in range(len(lst) - 1 - i):
            if lst[j] > lst[j + 1]:
                lst[j], lst[j + 1] = lst[j + 1], lst[j]
    return lst


l1 = [33, 11, 44, 22, 55, 66, 12, 42, 23, 45, 97, 54]
print(bubble_sort(l1))
#[11, 12, 22, 23, 33, 42, 44, 45, 54, 55, 66, 97]

————————————————
选择排序
思路:
1.遍历待排序数列,并定义当前位置的元素为此次循环最小值
(首先找到最小的元素)
2.若最小元素不是待排序数列的第一个元素,将其和第一个元素互换
3.将该元素与剩下的元素依次比较寻找最小元素,重复1,2直至结束

### 冒泡排序插入排序时间复杂度分析 #### 冒泡排序时间复杂度 冒泡排序利用双层`for`循环实现,内层循环负责实际的数据交换操作。对于长度为n的数组,在最坏情况下——即当序列完全逆序时,每次都需要遍历并比较剩余的所有元素。此时,总的比较次数可以表示为\[ \sum_{i=1}^{n-1}(n-i)=\frac{n(n-1)}{2}\],这表明其最坏情况下的时间复杂度为\(O(n^2)\)[^2]。 ```python 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] ``` 即使在最佳情形下(已经有序),如果不做任何优化措施,传统版本仍然会执行完整的两重循环结构,导致不必要的性能开销;不过可以通过设置标志位来检测某一轮是否有发生过交换动作从而提前终止程序运行以达到线性级别的表现[^4]。 #### 插入排序时间复杂度 相比之下,插入排序的表现则更加灵活多变。它的工作原理类似于人们整理手中扑克牌的过程:从未排序部分取出一张卡片,并将其放置到已排序区域中的合适位置上。如果初始序列接近于升序排列,则几乎不需要移动很多项就能完成整个过程,使得平均乃至最好情况能够逼近线性的\(O(n)\)级别效率[^3]。 然而,在面对全降序这样的极端场景时,每一个新加入的成员都要经过前面所有的节点才能找到自己的最终归属之处,累计下来同样形成了平方级的增长趋势,也就是最差的情况下时间复杂度也为\(O(n^2)\)[^1]。 ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i-1 while j >= 0 and key < arr[j]: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key ``` 综上所述,两种方法虽然都是基于相邻元素之间的对比来进行调整,但在不同条件下展现出明显差异化的效能特征。具体选择哪种取决于待解决问题的具体性质以及预期输入模式等因素考量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值