all tasks
This commit is contained in:
parent
b83f433714
commit
68f8f3e56b
14735 changed files with 178959 additions and 0 deletions
|
|
@ -0,0 +1,49 @@
|
|||
procedure main() #: demonstrate various ways to sort a list and string
|
||||
demosort(mergesort,[3, 14, 1, 5, 9, 2, 6, 3],"qwerty")
|
||||
end
|
||||
|
||||
procedure mergesort(X,op,lower,upper) #: return sorted list ascending(or descending)
|
||||
local middle
|
||||
|
||||
if /lower := 1 then { # top level call setup
|
||||
upper := *X
|
||||
op := sortop(op,X) # select how and what we sort
|
||||
}
|
||||
|
||||
if upper ~= lower then { # sort all sections with 2 or more elements
|
||||
X := mergesort(X,op,lower,middle := lower + (upper - lower) / 2)
|
||||
X := mergesort(X,op,middle+1,upper)
|
||||
|
||||
if op(X[middle+1],X[middle]) then # @middle+1 < @middle merge if halves reversed
|
||||
X := merge(X,op,lower,middle,upper)
|
||||
}
|
||||
return X
|
||||
end
|
||||
|
||||
procedure merge(X,op,lower,middle,upper) # merge two list sections within a larger list
|
||||
local p1,p2,add
|
||||
|
||||
p1 := lower
|
||||
p2 := middle + 1
|
||||
add := if type(X) ~== "string" then put else "||" # extend X, strings require X := add (until ||:= is invocable)
|
||||
|
||||
while p1 <= middle & p2 <= upper do
|
||||
if op(X[p1],X[p2]) then { # @p1 < @p2
|
||||
X := add(X,X[p1]) # extend X temporarily (rather than use a separate temporary list)
|
||||
p1 +:= 1
|
||||
}
|
||||
else {
|
||||
X := add(X,X[p2]) # extend X temporarily
|
||||
p2 +:= 1
|
||||
}
|
||||
|
||||
while X := add(X,X[middle >= p1]) do p1 +:= 1 # and rest of lower or ...
|
||||
while X := add(X,X[upper >= p2]) do p2 +:= 1 # ... upper trailers if any
|
||||
|
||||
if type(X) ~== "string" then # pull section's sorted elements from extension
|
||||
every X[upper to lower by -1] := pull(X)
|
||||
else
|
||||
(X[lower+:(upper-lower+1)] := X[0-:(upper-lower+1)])[0-:(upper-lower+1)] := ""
|
||||
|
||||
return X
|
||||
end
|
||||
Loading…
Add table
Add a link
Reference in a new issue