1 -- extracted from Programming Pearls, page 110
2 function qsort(x
,l
,u
,f
)
4 local m
=random(u
-(l
-1))+l
-1 -- choose a random pivot in range l..u
5 x
[l
],x
[m
]=x
[m
],x
[l
] -- swap pivot to first position
6 local t
=x
[l
] -- pivot value
10 -- invariant: x[l+1..m] < t <= x[m+1..i-1]
13 x
[m
],x
[i
]=x
[i
],x
[m
] -- swap x[i] and x[m]
17 x
[l
],x
[m
]=x
[m
],x
[l
] -- swap pivot to a valid place
18 -- x[l+1..m-1] < x[m] <= x[m+1..u]
24 function selectionsort(x
,n
,f
)
29 if f(x
[j
],x
[m
]) then m
=j
end
32 x
[i
],x
[m
]=x
[m
],x
[i
] -- swap x[i] and x[m]
43 if x
[i
] then write(",") end
50 while x
[n
] do n
=n
+1 end; n
=n
-1 -- count elements
52 qsort(x
,1,n
,function (x
,y
) return x
<y
end)
53 show("after quicksort",x
)
54 selectionsort(x
,n
,function (x
,y
) return x
>y
end)
55 show("after reverse selection sort",x
)
56 qsort(x
,1,n
,function (x
,y
) return x
<y
end)
57 show("after quicksort again",x
)
61 x
={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}