(original) (raw)

#!/usr/bin/env setl -- -- Sorting a map in SETL. -- -- Some different methods of sorting a map. -- -- This SETL program was created by Hakan Kjellerstrand (hakank@bonetmail.com) -- Also see my SETL page: http://www.hakank.org/setl/ -- setrandom(0); -- indeterministic n := 10000; a := [random 10 : i in [1..n]]; -- print(a); -- collect (creates a map with [number, occurrences of number]) m := collect(a); print(m); print("domain(m)",domain(m)); print("range(m)",range(m)); res1 := sort_map(m); print("sort_map", res1); res2 := sort_map_reverse(m); print("sort_map_reverse", res2); res3 := sort_on_range(m); print("sort_on_range:",res3); res4 := sort_on_range_reverse(m); print("sort_on_range_reverse:", res4); -- -- count the occurrences of each items in a -- proc collect(a); c := {}; for i in a loop c(i) +:= 1; end loop; return c; end proc; proc as_map(a); return {i: i in a}; end proc; -- sort map on domain (keys) proc sort_map(m); s := qsort([i : i in domain(m)]); res := [ [r,m{r}] : r in s]; return res; end proc; -- sort map on domain (keys), reverse proc sort_map_reverse(m); r1 := sort_map(m); res := [r1(i) : i in [#r1,#r1-1..1]]; return res; end proc; -- sort a map on range (values) proc sort_on_range(m); m2 := { [m(dd),dd] : dd in domain(m)}; r2 := [r : r in domain(m2)]; res := [ [r,m2{r}] : r in qsort(r2)]; return res; end proc; -- sort a map on range (values), reversed proc sort_on_range_reverse(m); r1 := sort_on_range(m); return [r1(i) : i in [#r1,#r1-1..1]]; end proc; -- -- quick sort -- proc qsort(a); if #a > 1 then pivot := a(#a div 2 + 1); a := qsort([x in a | x < pivot]) + [x in a | x = pivot] + qsort([x in a | x > pivot]); end if; return a; end proc;