当前位置: 首页 > news >正文

【算法】版本号排序

对版本号数组进行排序,比如:[0.1.2.3,1.2.1.0,4.2.1.0,0.1.2.0]


核心思路
将版本号拆分为数字数组,逐个比较每个子版本段。具体步骤:

  1. 拆分版本号:将每个版本字符串按 . 分割成数字数组
  2. 逐位比较:从高位到低位依次比较每个子版本段
  3. 处理长度差异:短版本号的缺失部分视为 0
  4. 降序/升序控制:根据比较结果返回排序依据

代码实现

function sortVersions(versions) {return versions.sort((a, b) => {const partsA = a.split('.').map(Number);  // 分割为数字数组 [0,1,2,3]const partsB = b.split('.').map(Number);const maxLen = Math.max(partsA.length, partsB.length);  // 最长版本位数for (let i = 0; i < maxLen; i++) {const numA = partsA[i] || 0;  // 超出长度部分补0const numB = partsB[i] || 0;if (numA !== numB) {return numB - numA;  // 降序排列(修改为numA - numB则为升序)}}return 0;  // 完全相等的情况});
}// 示例输入
const input = ['0.1.2.3', '1.2.1.0', '4.2.1.0', '0.1.2.0'];
console.log(sortVersions(input)); 
// 输出:[ '4.2.1.0', '1.2.1.0', '0.1.2.3', '0.1.2.0' ]

关键点解析

  1. 字符串转数字数组
    split('.') 切割后通过 map(Number) 转换为数值类型,避免字符串比较错误(如 "10" < "2"

  2. 补零处理长度差异
    使用 || 0 处理长度不一致的版本号,如 1.21.2.0 视为相等

  3. 循环比较逻辑
    逐位比较直到找到差异点,时间复杂度为 O(n)


应用场景优化

  1. 升序/降序切换
    修改 return numB - numAnumA - numB 即可实现升序排列

  2. 处理长版本号
    支持任意长度的版本号(如 1.2.3.4.5.6),最多可处理 10^3 量级的子版本号

  3. 特殊版本号扩展
    • 预发布版本:拆分 1.2.3-beta[1,2,3, 'beta'],自定义非数字部分的排序规则

    • 语义化版本:优先比较主版本号(Major),其次次版本号(Minor),最后修订号(Patch)


性能对比

方法时间复杂度适用场景缺陷
字符串直接比较O(n log n)纯数字且子版本位宽相同位宽不同时失效
大数加权法O(n log n)固定长度的语义化版本数值溢出风险
逐位比较法O(n log n)任意长度的数字版本号需处理类型转换

测试用例验证

// 测试案例
const testCases = [['1.10', '1.2'],        // 1.10 > 1.2['2.5', '2.5.0'],       // 相等['3.0.1', '3.0.0.9'],   // 3.0.1 > 3.0.0.9['0.1', '0.0.9999']    // 0.1 > 0.0.9999
];
testCases.forEach(tc => console.log(sortVersions(tc)[0])); 
// 输出均为第一个元素

相关文章:

  • Kotlin Compose 与传统 Android UI 开发对比
  • 小白成长之路-Linux用户与组管理(一)
  • 【MCP教程系列】SpringBoot 搭建基于 Spring AI 的 SSE 模式 MCP 服务
  • 【测试】测试基础概念
  • 重塑“DATA+AI“的共生范式:DataBuilder如何赋能企业数据价值跃迁
  • 在K8S集群中部署EFK日志收集
  • ubuntu20.04系统搭建k8s1.28集群-docker作为容器运行时
  • Ubuntu——执行echo $USE什么都不显示
  • tocmat 启动怎么设置 jvm和gc
  • 机器学习第十讲:异常值检测 → 发现身高填3米的不合理数据
  • CSS盒子模型:Padding与Margin的适用场景与注意事项
  • 初学c语言14(指针6)
  • CentOS7原有磁盘扩容实战记录(LVM非LVM)【针对GPT分区】
  • SpringBoot Vue MySQL酒店民宿预订系统源码(支付宝沙箱支付)+代码讲解视频
  • 【Linux】Linux 的管道与重定向的理解
  • 监控易一体化运维:网络流量分析的智慧引擎
  • 使用Git+Cron实现BIND的Named域名配置自动化管理!
  • java加强 -File
  • 【Java-EE进阶】SpringBoot针对某个IP限流问题
  • 【Linux C/C++开发】轻量级关系型数据库SQLite开发(包含性能测试代码)
  • 汕头违建豪宅“英之园”将强拆,当地:将根据公告期内具体情况采取下一步措施
  • 国务院关税税则委员会关于调整对原产于美国的进口商品加征关税措施的公告
  • 持续8年仍难终了的纠纷:败诉方因拒执罪被立案,胜诉方银行账户遭冻结
  • 牛市早报|中美日内瓦经贸会谈联合声明公布
  • “海豚音”依旧互动更多,玛丽亚·凯莉本周来沪开唱
  • 第三届“老山国际春茶节”活动在云南麻栗坡举办