Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
|
|
@ -0,0 +1,56 @@
|
|||
local function merge(left_container, left_container_begin, left_container_end, right_container, right_container_begin, right_container_end, result_container, result_container_begin, comparator)
|
||||
while left_container_begin <= left_container_end do
|
||||
if right_container_begin > right_container_end then
|
||||
for i = left_container_begin, left_container_end do
|
||||
result_container[result_container_begin] = left_container[i]
|
||||
result_container_begin = result_container_begin + 1
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
if comparator(right_container[right_container_begin], left_container[left_container_begin]) then
|
||||
result_container[result_container_begin] = right_container[right_container_begin]
|
||||
right_container_begin = right_container_begin + 1
|
||||
else
|
||||
result_container[result_container_begin] = left_container[left_container_begin]
|
||||
left_container_begin = left_container_begin + 1
|
||||
end
|
||||
|
||||
result_container_begin = result_container_begin + 1
|
||||
end
|
||||
|
||||
for i = right_container_begin, right_container_end do
|
||||
result_container[result_container_begin] = right_container[i]
|
||||
result_container_begin = result_container_begin + 1
|
||||
end
|
||||
end
|
||||
|
||||
local function mergesort_impl(container, container_begin, container_end, comparator)
|
||||
local range_length = (container_end - container_begin) + 1
|
||||
if range_length < 2 then return end
|
||||
local copy = {}
|
||||
local copy_len = 0
|
||||
|
||||
for it = container_begin, container_end do
|
||||
copy_len = copy_len + 1
|
||||
copy[copy_len] = container[it]
|
||||
end
|
||||
|
||||
local middle = bit.rshift(range_length, 1) -- or math.floor(range_length / 2)
|
||||
mergesort_impl(copy, 1, middle, comparator)
|
||||
mergesort_impl(copy, middle + 1, copy_len, comparator)
|
||||
merge(copy, 1, middle, copy, middle + 1, copy_len, container, container_begin, comparator)
|
||||
end
|
||||
|
||||
local function mergesort_default_comparator(a, b)
|
||||
return a < b
|
||||
end
|
||||
|
||||
function table.mergesort(container, comparator)
|
||||
if not comparator then
|
||||
comparator = mergesort_default_comparator
|
||||
end
|
||||
|
||||
mergesort_impl(container, 1, #container, comparator)
|
||||
end
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
function getLower(a,b)
|
||||
local i,j=1,1
|
||||
return function()
|
||||
if not b[j] or a[i] and a[i]<b[j] then
|
||||
i=i+1; return a[i-1]
|
||||
else
|
||||
j=j+1; return b[j-1]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function merge(a,b)
|
||||
local res={}
|
||||
for v in getLower(a,b) do res[#res+1]=v end
|
||||
return res
|
||||
end
|
||||
|
||||
function mergesort(list)
|
||||
if #list<=1 then return list end
|
||||
local s=math.floor(#list/2)
|
||||
return merge(mergesort{unpack(list,1,s)}, mergesort{unpack(list,s+1)})
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue