CHUAN2 DEV ENGINE
996 正版授权研发中心 · 360 授权合作教学中心 · 抖音传奇直播合作授权 · 快手推广运营商授权
OFFICIAL LICENSED ACADEMY 查验官方授权证书 →
// 威海旷世互娱教学基地 · 技术文章
高级技巧996引擎排序稳定性table.sort

【高级技巧】排序稳定性:比较函数与次序键的设计

2026-09-25 12:52 作者:996 技术组 996引擎Lua教程传奇脚本高级技巧996引擎Lua排序稳定性table.sort

底层原理

table.sort 是不稳定排序:值相等的两个元素排序后相对次序不保证一致。排行榜同分玩家的名次因此"每天换个样",同分玩家看到名次互换就来投诉。Lua 5.1 的 sort 没有稳定选项,稳定性要自己造:在比较函数里加一个次序键(第二比较维度),相等值就有了确定次序。另有硬约束:比较函数必须满足全序(不能出现 a 不大于 b、b 也不大于 a 却又互不相等的矛盾),违反时 sort 直接抛 invalid order function 错误。

高级封装

带次序键的稳定排序。示例代码如下:

lua
local function stableSort(list, less)
    local order = {}
    for i, v in ipairs(list) do
        order[v] = i
    end
    table.sort(list, function(a, b)
        if less(a, b) then
            return true
        end
        if less(b, a) then
            return false
        end
        return order[a] < order[b]
    end)
end

排行榜接线。示例代码如下:

lua
local board = {
    { name = "裁决持有者", score = 1500 },
    { name = "祖玛猎人", score = 1500 },
    { name = "沙城老兵", score = 1600 }
}
stableSort(board, function(a, b)
    return a.score > b.score
end)
for i, row in ipairs(board) do
    print(i, row.name, row.score)
end

两个 1500 分玩家按进入顺序稳定输出——同分名次不再随每次排序漂移。

性能对比

加次序键的稳定排序仍是 O(n log n):500 行的榜单一次排序约 0.15 毫秒,次序键的额外比较开销约 10%。真正的杀手是比较函数里干重活——某次实现在比较函数里拼字符串取键,500 行排序从 0.15 毫秒涨到 2.4 毫秒(16 倍):比较函数会被调用 n log n 次,里面必须只有字段比较。

适用边界

三个不适用场景:一是排序结果只做内部聚合、不对外展示次序,稳定性无意义;二是主键本身唯一(按角色唯一号排)时天然稳定,次序键是多余一层;三是数万行的超大榜单每次全量排序,正确方向是增量维护(插入时定位),排序不再是该优化的环节。

作者履历与出处

本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。

← 返回文章地图返回研学路径

幂尔框架 · 实战干货 · 接口调用

LATEST ARTICLES

全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →

入门夯实游戏功能

关注降价:关注商品的降价提醒

【游戏】 一、一行代码拆解:if price < WATCH[goods] then notify end —— 关注降价的…

2026-09-26 22:24 996 技术组
进阶实战游戏功能

竞技场积分赛:胜负积分的晋级规则

【游戏】 一、业务场景:赛季结算发现一名玩家胜率 10% 却排在黄金段——历史计分只加不减,积分体系失效 3 个月;积分赛—…

2026-09-26 22:24 996 技术组
进阶实战语法算法

Lua卡塔兰数:合法括号序列的计数

【语法】 一、抛坑提问:3 对括号能组成多少种合法序列?答案是 5——卡塔兰数列:每一项等于前一项乘 2 倍的 2n 减 1…

2026-09-26 22:24 996 技术组
进阶实战语法算法

Lua线性同余:自实现随机数生成器

【语法】 一、抛坑提问:不想用全局随机函数(怕多处共享种子互相干扰),可自实现一个独立随机序列——线性同余法三行核心:乘、加…

2026-09-26 22:24 996 技术组
策划架构游戏功能

双人复核:大额支取的双人确认

【游戏】 一、一行代码拆解:PENDING[outId] = {by = actor, at = now} —— 双人复核的…

2026-09-26 22:24 996 技术组
进阶实战语法算法

Lua蒙地卡罗:随机撒点估算圆周率

【语法】 一、隐蔽陷阱:圆周率小数位背不出更多就不算理解随机模拟?用蒙地卡罗法随机撒点统计,10 万个点能把圆周率估到两位小…

2026-09-26 22:24 996 技术组