源码解析,附有详细注释:
/*ltablib.c*/
static void auxsort (lua_State *L, int l, int u) {
while (l < u) { /* for tail recursion */
int i, j;
/* sort elements a[l], a[(l+u)/2] and a[u] */
//----------------------------------------------
//1.比较首位和末尾位,如果比较函数返回真 则 交换值; sort_comp 这个方法 的第一个参数比第二个参数大, 即是拿更靠后的元素和前面的元素比较,然后看是否交换
lua_rawgeti(L, 1, l);
lua_rawgeti(L, 1, u);
if (sort_comp(L, -1, -2)) /* a[u] < a[l]? */
set2(L, l, u); /* swap a[l] - a[u] */
else
lua_pop(L, 2);
if (u-l == 1) break; /* only 2 elements */
//----------------------------------------------
//2.i 为 中间向上取整的位置 比如 1 2 3 则 i = 2;
// 然后 比较首位和第i位,如果比较函数返回真 则交换值
// 如果比较函数返回假 则将首位出栈,将末尾位入栈,
// 然后比较第i位和末尾位 如果比较函数返回真 则交换值
i = (l+u)/2;
lua_rawgeti(L, 1, i);
lua_rawgeti(L, 1, l);
if (sort_comp(L, -2, -1)) /* a[i]<a[l]? */
set2(L, i, l);

本文深入解析Lua中的排序算法实现,包括详细的源码分析和注释,对比不同排序方法的效率,如快速排序的哨兵法、挖坑法及快慢指针等。实验证明,Lua的排序算法比部分C++实现的快排更高效。
最低0.47元/天 解锁文章
806

被折叠的 条评论
为什么被折叠?



