我正在尝试跟踪合并排序中的数组元素之间的比较次数。该程序是用Lua编写的。我试图使用多个结果并跟踪计数器,但它没有成功。还有其他建议吗?
这是我的第一篇文章,如果它很乱,那就很抱歉。谢谢!
function merge_sort (src_array)
if #src_array <= 1 then
return src_array
else
local a1, a2 = split_array(src_array) -- splitting array to sort
return merge( -- merge the results recursively
merge_sort(a1),
merge_sort(a2))
end
end
答案 0 :(得分:4)
我正在尝试使用多个结果并跟踪计数器
如果您想使用多个结果执行此操作,则需要更改递归调用。 每个函数都应该返回一个已排序的数组以及对其进行排序所需的比较次数:
local s1, n1 = merge_sort(a1)
local s2, n2 = merge_sort(a2)
local s, n = merge(s1, s2)
return s, n1 + n2 + n
你的基本情况看起来像是
return src_array, 0
我认为可能额外的结果不值得,你最好使用本地计数器和嵌套的merge
函数:
function merge_sort (src_array)
local n = 0 -- number of comparisons
local function merge(a1, a2)
-- merge a1 and a2, incrementing n at each comparison
-- return merged array
end
local function sort(a)
if #a <= 1 then
return a
else
local a1, a2 = split_array(a) -- splitting array to sort
return merge( -- merge the results recursively
sort(a1),
sort(a2)) -- recursive call to `sort` *not* `merge_sort`
end
end
local sorted = sort(src_array)
return sorted, n
end
答案 1 :(得分:3)
使用upvalue(以下示例中的i):
do
local i = 0
function foo ()
if i>= 100 then return i end
i = i + 1
return foo()+foo()
end
end