Sorting
Quick Sort (Lomuto)
Choose the last item as a pivot, partition smaller values to its left, then recurse on the two sides.
Algorithm
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].
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.