lua table.sort() 源码阅读

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

源码解析,附有详细注释:

/*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);
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tobybo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值