/MergeSort.lua
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