数据结构中常见的时间复杂度 及大小排序

本文详细介绍了常见的算法时间复杂度,包括常数阶、线性阶、平方阶等,并阐述了它们之间的关系,帮助读者理解算法效率。从O(1)到O(nn),逐级解析不同复杂度的特点。

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

常见时间复杂度

执行次数函数举例非正式术语
12O(1)常数阶
2n+3O(n)线性阶
3n2+2n+1O(n2)平方阶
5log2n+20O(logn)对数阶
2n+3nlog2n+19O(nlogn)nlogn阶
6n3+2n2+3n+4O(n3)立方阶
2nO(2n)指数阶

注意,经常将log2n(以2为底的对数)简写成logn

常见时间复杂度之间的关系

所消耗的时间从小到大

O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn)

### 各种排序算法的时间复杂度比较 #### 选择排序 选择排序是一种简单直观的排序方法,在每次迭代过程中从未排序部分选出最小(或最大)的一个元素,将其放到已排序序列的最后。该算法具有平方时间复杂度 \(O(n^2)\),适用于小型数组或作为教学工具来介绍基本排序原理[^1]。 #### 冒泡排序 冒泡排序通过重复遍历要排序列表的方式工作,依次比较相邻两个元素并交换顺序不对者;此过程持续到整个队列有序为止。同样拥有\(O(n^2)\)级别的平均与最差情况下运行效率,不过对于几乎已经排好序的数据集可以达到接近线性的表现即最好情况为\(O(n)\)[^4]。 #### 插入排序 插入排序构建最终排序阵列的方法是从左至右逐步处理未排序项,并将每一项放置于当前已知有序子集中恰当位置上完成增量式增长。它也具备较好的局部优化能力以及较低的空间占用率(O(1)),然而总体而言仍需面对\(O(n^2)\)数量级的操作次数限制。 #### 快速排序 作为一种分治法策略实现高效内省排列机制——快速排序能够在线性对数时间内完成大部分实例的任务解决(\(O(n\log{}n)\)),尽管存在极端条件下退化成二次方程级别运算量的风险(\(O(n^2)\))[^3]。值得注意的是,由于递归调用栈的存在使得额外内存消耗大约相当于输入规模大小取自然对数值的程度[\(O(\log{}n)\)]。 #### 归并排序 基于相同的思想框架下运作—即将待整理集合拆分为若干独立小组件分别治理后再合并起来形成全局秩序—归并与前者相比更加稳定可靠且不会轻易恶化性能指标,始终维持着稳定的\(O(n\log{}n)\)时间开销不变的同时却牺牲了一定量存储资源用于辅助操作【具体来说就是需要额外分配等同原始数据长度的工作区】从而达到了空间复杂度\(O(n)\)的效果。 ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left_half = merge_sort(arr[:mid]) right_half = merge_sort(arr[mid:]) sorted_arr = [] while left_half and right_half: if left_half[0] < right_half[0]: sorted_arr.append(left_half.pop(0)) else: sorted_arr.append(right_half.pop(0)) # Append any remaining elements from either half. sorted_arr.extend(left_half or right_half) return sorted_arr ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值