当前位置: 首页 > 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])); 
// 输出均为第一个元素

http://www.xdnf.cn/news/450469.html

相关文章:

  • C++笔记-AVL树(包括单旋和双旋等)
  • 微信小程序学习之轮播图swiper
  • DeepSeek:AI助力高效工作与智能管理
  • Qwen3如何强化推理能力?
  • AISBench benchmark评测工具实操-精度评测场景-采用命令行指定模型和数据集的方式
  • ESP系列单片机选择指南:结合实际场景的最优选择方案
  • Jmeter 安装包与界面汉化
  • 【大模型】LLM概念相关问题(中)
  • day014-服务管理
  • Python机器学习笔记(二十二、模型评估-交叉验证)
  • 润金店发布“爱有千斤重“30周年限定爱意礼盒:以东方美学诠释爱的重量
  • elementplus el-tree 二次封装支持配置删除后展示展开或折叠编辑复选框懒加载功能
  • js对象原型,原型链
  • 制作一款打飞机游戏48:敌人转向
  • 嵌入式学习笔记 D20 :单向链表的基本操作
  • 3DMAX脚本病毒Spy CA查杀方法
  • 计算机网络笔记(二十八)——4.10软件定义网络SDN简介
  • 【0415】Postgres内核 释放指定 memory context 中所有内存 ④
  • 5.14 BGP作业
  • Linux操作系统实战:进程创建的底层原理(转)
  • 朱老师, 3518e系列,第三季
  • 【Python】杂乱-[代码]Python 替换字符串中相关字符的方法
  • 容器安全-核心概述
  • OpenCV人脸识别LBPH算法原理、案例解析
  • Codeforces Round 1003 (Div. 4)
  • 分布式一致性协议Raft
  • 动物乐园-第16届蓝桥第5次STEMA测评Scratch真题第5题
  • 11-SGM41299-TEC驱动芯片--40℃至+125℃-3A
  • 1. Go 语言环境安装
  • 数据清洗的艺术:如何为AI模型准备高质量数据集?