723 |
723 |
724 (** orders **) |
724 (** orders **) |
725 |
725 |
726 datatype order = LESS | EQUAL | GREATER; |
726 datatype order = LESS | EQUAL | GREATER; |
727 |
727 |
|
728 fun rev_order LESS = GREATER |
|
729 | rev_order EQUAL = EQUAL |
|
730 | rev_order GREATER = LESS; |
|
731 |
|
732 fun make_ord rel (x, y) = |
|
733 if rel (x, y) then LESS |
|
734 else if rel (y, x) then GREATER |
|
735 else EQUAL; |
|
736 |
728 fun int_ord (i, j: int) = |
737 fun int_ord (i, j: int) = |
729 if i < j then LESS |
738 if i < j then LESS |
730 else if i = j then EQUAL |
739 else if i = j then EQUAL |
731 else GREATER; |
740 else GREATER; |
732 |
741 |
885 in part i end; |
894 in part i end; |
886 |
895 |
887 |
896 |
888 (* sorting *) |
897 (* sorting *) |
889 |
898 |
890 (*insertion sort; stable (does not reorder equal elements) |
899 (*quicksort (stable, i.e. does not reorder equal elements)*) |
891 'less' is less-than test on type 'a*) |
900 fun sort ord = |
892 fun sort (less: 'a*'a -> bool) = |
901 let |
893 let fun insert (x, []) = [x] |
902 fun qsort xs = |
894 | insert (x, y::ys) = |
903 let val len = length xs in |
895 if less(y, x) then y :: insert (x, ys) else x::y::ys; |
904 if len <= 1 then xs |
896 fun sort1 [] = [] |
905 else |
897 | sort1 (x::xs) = insert (x, sort1 xs) |
906 let val (lts, eqs, gts) = part (nth_elem (len div 2, xs)) xs in |
898 in sort1 end; |
907 qsort lts @ eqs @ qsort gts |
|
908 end |
|
909 end |
|
910 and part _ [] = ([], [], []) |
|
911 | part pivot (x :: xs) = add (ord (x, pivot)) x (part pivot xs) |
|
912 and add LESS x (lts, eqs, gts) = (x :: lts, eqs, gts) |
|
913 | add EQUAL x (lts, eqs, gts) = (lts, x :: eqs, gts) |
|
914 | add GREATER x (lts, eqs, gts) = (lts, eqs, x :: gts); |
|
915 in qsort end; |
899 |
916 |
900 (*sort strings*) |
917 (*sort strings*) |
901 fun sort_wrt sel xs = sort (op <= o pairself (sel: 'a -> string)) xs; |
918 val sort_strings = sort string_ord; |
902 val sort_strings = sort_wrt I; |
919 fun sort_wrt sel xs = sort (string_ord o pairself sel) xs; |
903 |
920 |
904 |
921 |
905 (* transitive closure (not Warshall's algorithm) *) |
922 (* transitive closure (not Warshall's algorithm) *) |
906 |
923 |
907 fun transitive_closure [] = [] |
924 fun transitive_closure [] = [] |