news 2026/10/13 11:39:11

[算法设计与分析-从入门到入土] 基础算法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[算法设计与分析-从入门到入土] 基础算法

[算法设计与分析-从入门到入土] 基础算法

个人导航

知乎:https://www.zhihu.com/people/byzh_rc

CSDN:https://blog.csdn.net/qq_54636039

注:本文仅对所述内容做了框架性引导,具体细节可查询其余相关资料or源码

参考文章:各方资料

文章目录

  • [算法设计与分析-从入门到入土] 基础算法
  • 个人导航
  • 二分查找(binary search)
  • 合并算法(merge two sorted lists)
  • 选择排序(selection sort)
  • 插入排序(insertion sort)
  • 自底向上的合并(bottom-up merge sort)
  • 基数排序radix sort
  • 快速排序quicksort
  • 算法总结

二分查找(binary search)

  • 若数组长度为 2n(偶数):取第 n 个元素为中间值,左侧n − 1 n-1n−1个元素,右侧 n 个元素
  • 若数组长度为2 n + 1 2n+12n+1(奇数):取第 n 个元素为中间值,左右两侧各 n 个元素

合并算法(merge two sorted lists)

场景: 数组区间[ p , q ] [p,q][p,q]和[ q + 1 , r ] [q+1,r][q+1,r]已分别有序,需合并为[ p , r ] [p,r][p,r]的有序数组

思路: 双指针法 + 额外开辟长度为 n 的辅助空间,排序后赋值回原数组

  • 元素赋值次数:2n 次
  • 比较次数:min ⁡ ( n 1 , n 2 ) ∼ ( n − 1 ) \min(n_1,n_2) \sim (n-1)min(n1​,n2​)∼(n−1)次(n 1 , n 2 n_1,n_2n1​,n2​为两个子数组长度)

选择排序(selection sort)

序列: [已排序序列, 未排序序列]

思路: 每一轮从未排序子序列中选择最小值,放入已排序子序列的末尾

  • 比较次数:固定为n ( n − 1 ) 2 \frac{n(n-1)}{2}2n(n−1)​次
  • 元素赋值次数:0 ∼ 3 ( n − 1 ) 0 \sim 3(n-1)0∼3(n−1)次(最优情况无需交换,最差情况需n − 1 n-1n−1次交换)

插入排序(insertion sort)

序列: [已排序序列, 未排序序列]

思路: 已排序序列的初始长度为 1,逐个将未排序元素插入已排序部分的合适位置

重点: 执行移动操作而非交换操作

  • 比较次数:n − 1 ∼ n ( n − 1 ) 2 n-1 \sim \frac{n(n-1)}{2}n−1∼2n(n−1)​次(最优为数组已有序,最差为数组逆序)
  • 元素赋值次数:2 ( n − 1 ) ∼ 2 ( n − 1 ) + ∑ k = 1 n − 1 k 2(n-1) \sim 2(n-1)+\sum_{k=1}^{n-1}k2(n−1)∼2(n−1)+∑k=1n−1​k次

自底向上的合并(bottom-up merge sort)

设A是一个包含n个元素的数组

  • 首先,分成⌊ n / 2 ⌋ \lfloor n/2 \rfloor⌊n/2⌋个长度为 2 的已排序序列
    (若存在 1 个剩余元素,则将其传递到下一轮迭代)
  • 其次,合并⌊ n / 4 ⌋ \lfloor n/4 \rfloor⌊n/4⌋个连续的 “长度为 2 的序列” 对,得到⌊ n / 4 ⌋ \lfloor n/4 \rfloor⌊n/4⌋个长度为 4 的已排序序列
    (若剩余 3 个元素,则将其中 2 个元素与 1 个元素合并)
  • 重复此过程

若当前的合并步长为2 j − 1 2^{j-1}2j−1, 待合并的剩余元素为 k 个:

  • 若1 ≤ k ≤ 2 j − 1 1 \le k \le 2^{j-1}1≤k≤2j−1:剩余元素传递至下一轮合并
  • 若2 j − 1 < k < 2 j 2^{j-1} < k < 2^j2j−1<k<2j:剩余元素需要在当前轮完成合并
轮次指标比较次数C j C_jCj​赋值次数A j A_jAj​
单轮计算n 2 j ( 2 j − 1 ∼ 2 j − 1 ) \frac{n}{2^j}(2^{j-1} \sim 2^j-1)2jn​(2j−1∼2j−1)n 2 j × 2 j + 1 = 2 n \frac{n}{2^j} \times 2^{j+1}=2n2jn​×2j+1=2n
总复杂度n log ⁡ n 2 ≤ C ≤ n log ⁡ n − n + 1 \frac{n\log n}{2} \le C \le n\log n -n +12nlogn​≤C≤nlogn−n+1A = 2 n log ⁡ n A=2n\log nA=2nlogn

第一轮(j=1)是合并长度为1的子数组
-> k=1 ->7传递到下一轮

第二轮(j=2)是合并长度为2的子数组
-> k=3 ->12和7合并

第三轮(j=3)是合并长度为4的子数组
-> k=3 ->127传到下一轮

第四轮(j=4)是合并长度为8的子数组
-> k=3 -> 合并all

基数排序radix sort

基数排序是一种基于“位”的排序算法,适用于所有元素均由固定位数(k位)数字组成的列表

设待排序列表 $ L = {a_1, a_2, …, a_n} $,其中:

  • n 为列表中元素的个数
  • 每个元素 $ a_i $ 恰好由 k 位数字组成,形式为 $ d_kd_{k-1}…d_1 $
    ($ d_j $ 表示第 j 位数字,取值范围 0~9)

采用“从低位到高位”的排序顺序,依次对每一位数字进行排序:

  1. 首先对所有元素的最低位 $ d_1 $ 进行排序,得到初步有序的列表
  2. 基于上一步的结果,对第 2 位 $ d_2 $ 进行排序
  3. 重复上述过程,直到对最高位 $ d_k $ 完成排序,最终得到完全有序的列表

时间复杂度:Θ ( n ) \Theta(n)Θ(n)

空间复杂度:Θ ( n ) \Theta(n)Θ(n)

例题: A[1…5] = 7467 3275 6792 9134 1239

0123456789
d167929134327574671239
d29134, 1239746732756792
d391341239, 327574676792
d412393275679274679134

前一轮已排好的相对顺序不变:

如( d 2 , 3 ) (d_2,3)(d2​,3)的9134, 1239, 根据d 1 d_1d1​的结果, 9134应该在1239前面

快速排序quicksort

快速排序采用分治思想,核心操作是分割:

  1. 从数组A[low...high]中选取一个元素作为枢轴,通常选取A[low]
  2. 对数组进行重排,使得:
    • 所有小于等于枢轴的元素移到枢轴左侧
    • 所有大于枢轴的元素移到枢轴右侧
  3. 重排后,枢轴会被放置在最终的正确位置A[w](low ≤ w ≤ high)
  4. 递归地对枢轴左侧和右侧的子数组重复上述操作,直到整个数组有序
变量含义
i指向小于等于枢轴的元素区域的末尾
j指向当前正在遍历的元素

分割的时间复杂度:Θ ( n ) \Theta(n)Θ(n)(遍历数组一次)

-> 时间复杂度:Θ ( n l o g n ) \Theta(nlogn)Θ(nlogn)
-> 空间复杂度:Θ ( 1 ) \Theta(1)Θ(1)(原地操作,无需额外空间)

例子: 5 3 9 2 7 1 8

lowhigh
5(i)392718
53(i)(j)92718
53(i)9(j)2718
539(i)2(j)718
532(i)9(j)718
532(i)97(j)18
5329(i)71(j)8
5321(i)79(j)8
5321(i)798(j)
1325798

往后把1, 3, 2看做一组, 把7, 9, 8看做一组
再去分别做

例子: 4 6 3 1 8 7 2 5

lowhigh
4(i)6318725
4(i)6(j)318725
46(i)3(j)18725
43(i)6(j)18725
436(i)1(j)8725
431(i)6(j)8725
431(i)68(j)725
431(i)687(j)25
4316(i)872(j)5
4312(i)876(j)5
4312(i)8765(j)
23148765

往后把2, 3, 1看做一组, 把8, 7, 6, 5看做一组
再去分别做

算法总结

CAO OOΩ \OmegaΩΘ \ThetaΘ
选择排序Selectionn ( n − 1 ) 2 \frac{n(n-1)}{2}2n(n−1)​0 ∼ 3 ( n − 1 ) 0\sim 3(n-1)0∼3(n−1)n 2 n^2n2n 2 n^2n2n 2 n^2n2
插入排序Insertionn − 1 ∼ n ( n − 1 ) 2 n-1 \sim \frac{n(n-1)}{2}n−1∼2n(n−1)​C + ( n − 1 ) C+(n-1)C+(n−1)n 2 n^2n2n nnn 2 n^2n2
自底向上Bottom Up Mergen log ⁡ n 2 ∼ n log ⁡ n − n + 1 \frac{n\log n}{2}\sim n\log n-n+12nlogn​∼nlogn−n+12 n log ⁡ n 2n\log n2nlognn log ⁡ n n\log nnlognn log ⁡ n n\log nnlognn log ⁡ n n\log nnlogn

插入排序的Θ ( n 2 ) \Theta(n^2)Θ(n2)计算来自: 平均分析

AlgorithmTime ComplexitySpace Complexity
selection sortΘ ( n 2 ) \Theta(n^2)Θ(n2)Θ ( 1 ) \Theta(1)Θ(1)(原地排序)
insertion sortΘ ( n 2 ) \Theta(n^2)Θ(n2)(最优Θ ( n ) \Theta(n)Θ(n))Θ ( 1 ) \Theta(1)Θ(1)(原地排序)
bottom-up mergeΘ ( n log ⁡ n ) \Theta(n\log n)Θ(nlogn)Θ ( n ) \Theta(n)Θ(n)(辅助数组)
radix sortΘ ( n ) \Theta(n)Θ(n)Θ ( n ) \Theta(n)Θ(n)(辅助数组)
quick sortΘ ( n log ⁡ n ) \Theta(n\log n)Θ(nlogn)(最坏Θ ( n 2 ) \Theta(n^2)Θ(n2))Θ ( 1 ) \Theta(1)Θ(1)(原地排序)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/11 22:06:40

大模型部署瓶颈怎么破?用TensorRT镜像实现极致低延迟推理

# 大模型部署瓶颈怎么破&#xff1f;用TensorRT镜像实现极致低延迟推理## 引言在大模型落地的现实战场上&#xff0c;一个残酷的事实是&#xff1a;再强大的模型&#xff0c;如果响应慢、吞吐低&#xff0c;最终也只能停留在实验室里。如今&#xff0c;从智能客服到自动驾驶感知…

作者头像 李华
网站建设 2026/10/11 15:38:59

针灸穴位推荐系统:治疗方案生成由TensorRT智能决策

针灸穴位推荐系统&#xff1a;治疗方案生成由TensorRT智能决策 在现代医疗场景中&#xff0c;医生面对的不仅是复杂的病理机制&#xff0c;还有日益增长的临床决策压力。尤其是在中医领域&#xff0c;如何将千年传承的经验医学与当代人工智能技术深度融合&#xff0c;成为智能化…

作者头像 李华
网站建设 2026/10/11 1:55:15

STM32移植ModbusTCP协议栈的项目应用

在STM32上跑通ModbusTCP&#xff1a;从协议解析到工业级实战的完整路径你有没有遇到过这样的场景&#xff1f;一台HMI屏连不上你的STM32设备&#xff0c;Wireshark抓包一看——“Connection reset by peer”&#xff1b;或者现场PLC读数据时频繁超时&#xff0c;排查半天才发现…

作者头像 李华
网站建设 2026/10/11 2:32:05

大模型服务成本太高?用TensorRT镜像降低GPU资源消耗

大模型服务成本太高&#xff1f;用TensorRT镜像降低GPU资源消耗 在AI应用加速落地的今天&#xff0c;越来越多企业面临着一个尴尬的局面&#xff1a;训练好的大模型一上线&#xff0c;GPU账单就“爆表”。尤其是在高并发、低延迟的生产场景中——比如智能客服实时响应、视频平台…

作者头像 李华
网站建设 2026/10/10 23:36:39

CCS20多文件编译优化协调策略一文说清

一文讲透 CCS20 多文件编译优化&#xff1a;从工程结构到构建提速的实战指南你有没有经历过这样的场景&#xff1f;改了一行代码&#xff0c;点下“Build”&#xff0c;然后眼睁睁看着 IDE 编译了整整两分钟——而项目里大多数文件根本没动过。在基于 TI 芯片的嵌入式开发中&am…

作者头像 李华
网站建设 2026/10/11 19:41:41

WinDbg驱动调试图解说明与步骤解析

深入Windows内核&#xff1a;用WinDbg破解驱动难题的实战指南 你有没有遇到过这样的场景&#xff1f; 刚写完一个设备驱动&#xff0c;满怀信心地安装测试&#xff0c;结果系统“啪”一下蓝屏重启。事件查看器里只留下一行冰冷的日志&#xff1a;“Bug Check 0x1E: KMODE_EXC…

作者头像 李华