Quick sort using select
by Geert Jan Bex (LUC, Belgium)
>
qsort := proc(l::list)
local lt, ge, rl, i;
if nops(l) = 0 then
[];
else
rl := [seq(l[i], i=2..nops(l))];
lt := select(x -> x < l[1], rl);
ge := select(x -> x >= l[1], rl);
#print([lt, l[1], ge]);
[op(qsort(lt)), l[1], op(qsort(ge))];
fi;
end:
>
v_tmp:=[3,2,7,4,1,12,1,3,7];
qsort(v_tmp);
Quicksort on the text
>
quicksort := proc(A::array(1, numeric),m::integer, n::integer)
local partition, p;
partition := proc(m,n)
local i,j,x;
i := m;
j := n;
x := A[j];
while i<j do
if A[i]>x then
A[j] := A[i];
j := j-1;
A[i] := A[j];
else
i := i+1;
end if;
end do;
A[j] := x;
p := j;
end proc:
if m<n then # if m>=n there is nothing to do
p:=partition(m, n);
quicksort(A, m, p-1);
quicksort(A, p+1, n);
end if;
eval(A);
end proc:
>
> a := array( [2,4,1,5,3] );
> quicksort( a, 1, 5);
Quicksort for listlist
>
partition := proc(m,n)
global A,p;
local i,j,x;
i := m;
j := n;
x := A[j];
while i<j do
if A[i][1]>x[1] then
A[j] := A[i];
j := j-1;
A[i] := A[j];
else
i := i+1;
end if;
end do;
A[j] := x;
p := j;
end proc:
>
quicksort := proc(m::integer, n::integer)
local p;
global A;
if m<n then # if m>=n there is nothing to do
p:=partition(m, n);
print(p);
quicksort(m, p-1);
quicksort(p+1, n);
end if;
eval(A);
end proc:
>
A:=[[2,1],[4,2],[1,3],[5,4],[3,5]];
quicksort(1,5);
eval(A);