1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
| -- 归并排序算法学习 --[[ 1. 设置临时table, 用来存放排序之后的数组 2. 设定两个值i,j, 初始值分别为两个待排序数组的第一个key 3. 比较key为i,j对应的值, 较小的放入合并空间, 并移动到下一个值 4. 重复步骤3到i,j其中一个超出数组最大值 5. 将另一个数组的剩下的元素复制到临时table中 ]] function merge(sourTab, tmpTab, startIndex, midIndex, endIndex) local i = startIndex local j = midIndex + 1 local k = startIndex while(i <= midIndex and j <= endIndex) do if sourTab[i] > sourTab[j] then tmpTab[k] = sourTab[j] j = j + 1 else tmpTab[k] = sourTab[i] i = i + 1 end k = k + 1 end
-- 将剩下的拼到临时table的末尾 理论上i, j只有一个剩下 while (i <= midIndex) do tmpTab[k] = sourTab[i] k = k + 1 i = i + 1 end
-- 将剩下的拼到临时table的末尾 while (j <= endIndex) do tmpTab[k] = sourTab[j] k = k + 1 j = j + 1 end
-- 将排序好的数组赋值回原table, 这一步不能省略 for i = startIndex, endIndex do sourTab[i] = tmpTab[i] end end
function mergeSort(sourTab, tmpTab, startIndex, endIndex) if startIndex < endIndex then local midIndex = startIndex + math.floor((endIndex - startIndex) / 2) mergeSort(sourTab, tmpTab, startIndex, midIndex) mergeSort(sourTab, tmpTab, midIndex + 1, endIndex) merge(sourTab, tmpTab, startIndex, midIndex, endIndex) end end
local tab = {50, 10, 20, 30, 70, 40, 80, 60} local tab1 = {} mergeSort(tab, tab1, 1, #tab) print(table.concat(tab, ","))
|