据说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)
算法相比,速度慢得多(大约需要一分钟来对一百万个条目表中的所有随机放置的条目进行排序),对同一个表进行排序只需要大约五秒钟?
答案 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,","))
请注意,如果无法修改输入表,则将其复制到牺牲表并进行原地排序也将比“纯”实现更快。