q_sort.mws

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);

v_tmp := [3, 2, 7, 4, 1, 12, 1, 3, 7]

[[2, 1, 1], 3, [7, 4, 12, 3, 7]]

[[1, 1], 2, []]

[[], 1, [1]]

[[], 1, []]

[[4, 3], 7, [12, 7]]

[[3], 4, []]

[[], 3, []]

[[7], 12, []]

[[], 7, []]

[1, 1, 2, 3, 3, 4, 7, 7, 12]

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] );

a := vector([2, 4, 1, 5, 3])

> quicksort( a, 1, 5);

vector([1, 2, 3, 4, 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);

A := [[2, 1], [4, 2], [1, 3], [5, 4], [3, 5]]

3

1

4

[[1, 3], [2, 1], [3, 5], [4, 2], [5, 4]]

[[1, 3], [2, 1], [3, 5], [4, 2], [5, 4]]