news 2026/4/18 6:44:48

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

作者头像

张小明

前端开发工程师

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-1n1个元素,右侧 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)(n1)次(n 1 , n 2 n_1,n_2n1,n2为两个子数组长度)

选择排序(selection sort)

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

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

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

插入排序(insertion sort)

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

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

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

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

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

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

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

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

  • 1 ≤ k ≤ 2 j − 1 1 \le k \le 2^{j-1}1k2j1:剩余元素传递至下一轮合并
  • 2 j − 1 < k < 2 j 2^{j-1} < k < 2^j2j1<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(2j12j1)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 +12nlognCnlognn+1A = 2 n log ⁡ n A=2n\log nA=2nlogn

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

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

第三轮(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(n1)0 ∼ 3 ( n − 1 ) 0\sim 3(n-1)03(n1)n 2 n^2n2n 2 n^2n2n 2 n^2n2
插入排序Insertionn − 1 ∼ n ( n − 1 ) 2 n-1 \sim \frac{n(n-1)}{2}n12n(n1)C + ( n − 1 ) C+(n-1)C+(n1)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+12nlognnlognn+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/3/24 18:29:35

基于L298N电机驱动模块STM32的智能小车设计:手把手教程

从零构建智能小车&#xff1a;L298N与STM32的实战控制艺术你有没有试过亲手做一个能跑、能拐弯、还能自动避障的小车&#xff1f;不是买回来拼一拼的那种&#xff0c;而是从电路设计到代码编写&#xff0c;每一步都自己掌控——那种“它听我的”成就感&#xff0c;简直上头。在…

作者头像 李华
网站建设 2026/4/11 8:37:33

超详细版STM32CubeMX点亮LED灯在HMI面板中的集成方法

让硬件“会说话”&#xff1a;用STM32CubeMX实现LED状态在HMI面板上的可视化交互 你有没有过这样的经历&#xff1f;调试一个嵌入式系统时&#xff0c;盯着板子上那颗小小的LED灯&#xff0c;心里默念&#xff1a;“亮了是运行中&#xff0c;灭了是待机……等等&#xff0c;刚才…

作者头像 李华
网站建设 2026/4/16 1:38:06

jflash下载入门必看:新手快速上手配置指南

jflash下载实战指南&#xff1a;从零搭建稳定烧录环境 你有没有遇到过这样的场景&#xff1f;代码明明编译通过了&#xff0c;但一到下载就报“ Target not connected ”&#xff1b;或者固件写进去了&#xff0c;运行却像卡顿的旧手机——闪烁几下就死机。更糟的是产线批量…

作者头像 李华
网站建设 2026/4/18 3:50:06

港口物流调度AI:集装箱分配方案在TensorRT上快速生成

港口物流调度AI&#xff1a;集装箱分配方案在TensorRT上快速生成 在全球贸易持续增长的背景下&#xff0c;港口每天要处理数以万计的集装箱流转任务。靠泊的货轮、穿梭的集卡、繁忙的岸桥&#xff0c;每一个环节都牵一发而动全身。稍有延迟&#xff0c;就可能引发连锁延误&…

作者头像 李华
网站建设 2026/4/18 3:51:56

品牌声誉监控:社交媒体情绪分析通过TensorRT全天候追踪

品牌声誉监控&#xff1a;社交媒体情绪分析通过TensorRT全天候追踪 在微博热搜瞬息万变、一条短视频可能引爆全网舆论的今天&#xff0c;企业对品牌声誉的掌控力正面临前所未有的挑战。某知名饮料品牌曾因一段用户拍摄的“瓶盖松动”视频&#xff0c;在48小时内遭遇负面舆情扩散…

作者头像 李华