Sorting
Quick Sort (Lomuto)
Choose the last item as a pivot, partition smaller values to its left, then recurse on the two sides.
Algorithm
The checked-in replay follows the same small input and final output across all 21 DSA books, so this Lua DSA implementation can be compared directly with the other languages.
pivot
The final element is moved to the boundary between smaller and larger values.
partition
One scan rearranges the current range before the recursive calls.
Visual walkthrough
Basic Implementation
basic.lua
local function partition(arr, low, high)
local pivot = arr[high]
local i = low - 1
for j = low, high - 1 do
if arr[j] <= pivot then
i = i + 1
arr[i], arr[j] = arr[j], arr[i]
end
end
arr[i + 1], arr[high] = arr[high], arr[i + 1]
return i + 1
end
local function quick_sort(arr, low, high)
if low < high then
local pivot_index = partition(arr, low, high)
quick_sort(arr, low, pivot_index - 1)
quick_sort(arr, pivot_index + 1, high)
end
end
local arr = {4, 1, 5, 2, 3}
quick_sort(arr, 1, #arr)
io.write("[")
for k = 1, #arr do
if k > 1 then io.write(", ") end
io.write(tostring(arr[k]))
end
io.write("]\n")
Complexity
- Time: O(n^2) worst, O(n log n) average
- Space: O(log n) average call stack
- Stable: no
Implementation notes
local arr = {4, 1, 5, 2, 3}is sorted in place byquick_sort(arr, 1, #arr).partition(arr, low, high)chooses the pivot withlocal pivot = arr[high]; in the first call, Lua slot5holds pivot3.- Lua source indexes are 1-based:
local i = low - 1starts at0, andfor j = low, high - 1 doscans slots1through4. - The partition comparison is
if arr[j] <= pivot then, so only values at or below the pivot move to the left side. - Swaps use Lua multiple assignment:
arr[i], arr[j] = arr[j], arr[i]. - The replay labels positions in zero-based cross-language form: it keeps
4right of pivot3, swaps1left, keeps5right, then swaps2left. - Those partition steps change the table from
[4, 1, 5, 2, 3]to[1, 4, 5, 2, 3], then[1, 2, 5, 4, 3]. - The final pivot swap
arr[i + 1], arr[high] = arr[high], arr[i + 1]puts3in Lua slot3; the trace reports that as pivot index2. quick_sortrecurses onlow..pivot_index - 1andpivot_index + 1..high; the replay summarizes the left side[1, 2]and right side[4, 5].- The final
io.writeloop prints[1, 2, 3, 4, 5].