算法/数据结构 · 2023年11月28日 0

常见算法及其时间复杂度总结【】

前言
记录一些常见算法时间复杂度
O(1) < O(logn) < O(n) < O(nlogn) < O(n2 ) < O(n3) < O(2n) < O(n!) < O(nn)

一、O(1)
常见算法:数组随机存取、固定大小的循环、获取链表的长度或头尾节点、简单算术运算或位运算(+、-、*、/、&、|、~、^)、哈希散列表查找(unordered_map、unordered_set)
数组随机存取:数组具有

二、O(logn)
表示log2n
常见算法:for或while以i*2或i/2进行变化、二分查找、平衡二叉树查找(map、set)、分治算法

三、O(n)
常见算法:线性查找、以变量为迭代指标遍历、求和、计数、拷贝、阶乘算法、链表合并(max(m,n))、计数排序、桶排序、广度优先搜索算法、深度优先搜索算法

四、O(nlogn)
常见算法:堆排序、快速排序、归并排序、希尔排序、计数排序、基数排序、C+±std::sort()
堆排序:大根堆、小根堆,属于二叉排序树/二叉搜索树/二叉查找树
快速排序:自上而下将数据进行分治
归并排序:自下而上将数据分治为小粒度,再进行合并
C++标准库的std::sort():通常是使用快速排序、归并排序或堆排序等。

五、O(n^2)
常见算法:两层循环嵌套、冒泡排序、选择排序、插入排序、希尔排序、矩阵乘法朴素算法、求解线性方程组的高斯消元法
冒泡排序:两层循环,外层i正常遍历0 ~ n-1,内层j从0 ~ n-1-i,内层每一轮使j+1处数据>j处数据(如不满足则交换两位置数据)
选择排序:两层循环,外层i正常遍历0 ~ n-1,内层j从i+1 ~ n,内层每轮确定一个最小的数的位置,将之与i处的数据交换
插入排序:两层循环,外层i正常遍历1 ~ n-1,内层j从 i起往前遍历,确保j-1处的数据<j处的数据(如不满足则交换两位置数据)

六、O(n^3)
常见算法:三层循环嵌套、常规矩阵乘法、Floyd-Warshall 算法、求解线性方程组的高斯消元法

七、O(2^n)
常见算法:斐波那契递归、递归组合生成算法、动态规划的指数级实现

八、O(n!)
常见算法:全排列生成算法、旅行商问题暴力破解算法、递归字典序生成算法

九、O(nn)
常见算法:暴力搜索算法、递归全排列算法、递归子集生成算法、递归布尔表达式求解算法

总结
附上别处的总结图片对比参考:
在这里插入图片描述
在这里插入图片描述
算法时间复杂度
内存外存排序算法
线性非线性排序算法

稳定的排序算法:冒泡排序、插入排序、归并排序、基数排序
不稳定的排序算法:选择排序、快速排序、希尔排序、堆排序

各排序算法优化:

快速排序:

快排若默认选取第一个/最后一个作为标定点则时间复杂度在基本有序的原始数据上接近O(n2),此时可以选用随机标定点,时间复杂度为O(nlogn)
对数据量低于20的递归部分采用插入排序
归并排序:

对数据量低于20的递归部分采用插入排序
冒泡排序 :

使用标志位判断排序终点
插入排序:

向前查找时使用二分查找提高效率
————————————————
版权声明:本文为CSDN博主「邱邱玩编程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45504248/article/details/125901326

打赏 赞(0) 分享'
分享到...
微信
支付宝
微信二维码图片

微信扫描二维码打赏

支付宝二维码图片

支付宝扫描二维码打赏