PageRenderTime 78ms CodeModel.GetById 69ms app.highlight 5ms RepoModel.GetById 1ms app.codeStats 0ms

/MergeSort.lua

http://github.com/akosma/CodeaSort
Lua | 43 lines | 38 code | 5 blank | 0 comment | 5 complexity | 71770508f1cc8af4fc2a75e8cb1bd3a3 MD5 | raw file
 1
 2function mergeSort(array, p, r)
 3    p = p or 1
 4    r = r or #array
 5    if p < r then
 6        local q = math.floor((p + r) / 2)
 7        mergeSort(array, p, q)
 8        mergeSort(array, q + 1, r)
 9        merge(array, p, q, r)
10    end
11    return array
12end
13
14function merge(array, p, q, r)
15    local n1 = q - p + 1
16    local n2 = r - q
17    local i
18    local j
19    
20    local left = {}
21    for i = 1, n1 do
22        left[i] = array[p + i - 1]
23    end
24    left[n1 + 1] = math.huge
25    
26    local right = {}
27    for j = 1, n2 do
28        right[j] = array[q + j]
29    end
30    right[n2 + 1] = math.huge
31    
32    i = 1
33    j = 1
34    for k = p, r do
35        if left[i] <= right[j] then
36            array[k] = left[i]
37            i = i + 1
38        else
39            array[k] = right[j]
40            j = j + 1
41        end
42    end
43end