内置排序算法如何如此之快?

时间:2016-04-24 07:29:46

标签: sorting lua quicksort lua-table rosetta-code

据说Quicksort是用于在列表/表格/内容中对数据进行排序的最快速算法之一。无论如何rosettacode Lua如何实现这个算法

function quicksort(t)
    if #t < 2 then return t end
    local pivot = t[1]
    local a, b, c={}, {}, {}
    for _, v in ipairs(t) do
        if v < pivot then a[#a + 1] = v
        elseif v > pivot then c[#c + 1] = v
        else b[#b + 1] = v
        end
    end
    a = quicksort(a)
    c = quicksort(c)
    for _, v in ipairs(b) do a[#a + 1] = v end
    for _, v in ipairs(c) do a[#a + 1] = v end
    return a
end
与内置的table.sort(table)算法相比,

速度慢得多(大约需要一分钟来对一百万个条目表中的所有随机放置的条目进行排序),对同一个表进行排序只需要大约五秒钟?

3 个答案:

答案 0 :(得分:4)

内置table.sort也使用快速排序算法。 (见its code

主要区别在于,内置的是用C编写的。虽然Lua与其他脚本语言相比速度快,但它仍然没有C语言快。

答案 1 :(得分:1)

您应该将数据透视表设置为t [2],使我的编译器的性能提高一倍,但是根据实现快速排序的方式,它可能会破坏它。

答案 2 :(得分:0)

除了语言上的差异外,Lua内置的table.sort可以就地修改目标表。您的实现返回一个新表,每个迭代步骤实例化3个新表。我认为这是大多数性能丧失的地方。当对数百万个项目进行排序时,这些多余的表分配会迅速建立起来!

一个更适当的比较是进行就地快速排序

local quicksort do
  local function qhelp(t, l, r)
    if r - l < 1 then return end
    local p = l
    for i = l + 1, r do
      if t[i] < t[p] then
        if i == p + 1 then
          t[p],t[p+1] = t[p+1],t[p]
        else
          t[p],t[p+1],t[i] = t[i],t[p],t[p+1]
        end
        p = p + 1
      end
    end
    qhelp(t, l, p - 1)
    qhelp(t, p + 1, r)
  end

  function quicksort(t)
    qhelp(t, 1, #t)
  end
end

用法:

local arr = { 1, 5, 2, 17, 11, 3, 1, 22, 2, 37 }
quicksort(arr)
print(table.concat(arr,","))

请注意,如果无法修改输入表,则将其复制到牺牲表并进行原地排序也将比“纯”实现更快。