【语法】
一、隐蔽陷阱:手写快速排序固定取首元素当基准,遇到近乎有序的输入直接退化成平方级比较;三数取中——首、中、尾取中位数当基准,最坏情况概率大降。
二、底层原理:快排选定基准后分区:小的放左大的放右,基准归位再分治两侧;基准选取决定分区均衡度,三数取中让近乎有序的输入也能近似对半分。
三、正确代码:
错误写法。示例代码如下:
local function qsort(t, lo, hi)
if lo >= hi then return end
local p = t[lo] -- 固定首元素,有序输入退化
local i = lo
for j = lo + 1, hi do
if t[j] < p then
i = i + 1
t[i], t[j] = t[j], t[i]
end
end
t[lo], t[i] = t[i], t[lo]
qsort(t, lo, i - 1)
qsort(t, i + 1, hi)
end
正确写法。示例代码如下:
local function median3(t, lo, hi)
local mid = math.floor((lo + hi) / 2)
if t[mid] < t[lo] then t[lo], t[mid] = t[mid], t[lo] end
if t[hi] < t[lo] then t[lo], t[hi] = t[hi], t[lo] end
if t[hi] < t[mid] then t[mid], t[hi] = t[hi], t[mid] end
return t[mid] -- 三数取中位作基准
end
-- 分区逻辑同上,基准换用 median3(t, lo, hi)
四、引擎验证:1 万个近有序数值排序:固定基准版退化到 5000 万次比较;三数取中版 12 万次,快 400 倍。
五、FAQ:问:递归层数可控吗?答:取中后分区近似对半,层数对数级安全。
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
【语法】 一、机制原理 抛个坑:为什么每次重启客户端,界面上那批"随机"的每日提示都一模一样?因为 Lua 5.1 的 ma…
【游戏】 一、规则机制 线上事故:追踪面板只有一个槽位,做支线时主线目标被顶掉,玩家转头就忘了主线做到哪。追踪面板改成主副分…
【游戏】 一、规则机制 线上事故:一个总开关管所有声音,想关音乐留音效的玩家做不到,差评连片。声音设置拆成三路:音乐、音效、…
【语法】 一、机制原理 一行代码拆解: text n and text:sub(1, n) .. "..." or text…
【游戏】 一、规则机制 隐蔽的坑:两个功能绑了同一个键,按一下两个同时触发,好不容易攒的道具被误丢。快捷键定制三步走:可映射…
【游戏】 一、规则机制 隐蔽的坑:格子表中间被用过之后留下 nil 洞,整理时直接 sort,比较器一脚踩到 nil 当场报…