Initial data commit
This commit is contained in:
parent
72d218235f
commit
f23f22d71c
199087 changed files with 3378941 additions and 0 deletions
|
|
@ -0,0 +1,66 @@
|
|||
-- quickSort :: (Ord a) => [a] -> [a]
|
||||
on quickSort(xs)
|
||||
if length of xs > 1 then
|
||||
set {h, t} to uncons(xs)
|
||||
|
||||
-- lessOrEqual :: a -> Bool
|
||||
script lessOrEqual
|
||||
on |λ|(x)
|
||||
x ≤ h
|
||||
end |λ|
|
||||
end script
|
||||
|
||||
set {less, more} to partition(lessOrEqual, t)
|
||||
|
||||
quickSort(less) & h & quickSort(more)
|
||||
else
|
||||
xs
|
||||
end if
|
||||
end quickSort
|
||||
|
||||
|
||||
-- TEST -----------------------------------------------------------------------
|
||||
on run
|
||||
|
||||
quickSort([11.8, 14.1, 21.3, 8.5, 16.7, 5.7])
|
||||
|
||||
--> {5.7, 8.5, 11.8, 14.1, 16.7, 21.3}
|
||||
|
||||
end run
|
||||
|
||||
|
||||
-- GENERIC FUNCTIONS ----------------------------------------------------------
|
||||
|
||||
-- partition :: predicate -> List -> (Matches, nonMatches)
|
||||
-- partition :: (a -> Bool) -> [a] -> ([a], [a])
|
||||
on partition(f, xs)
|
||||
tell mReturn(f)
|
||||
set lst to {{}, {}}
|
||||
repeat with x in xs
|
||||
set v to contents of x
|
||||
set end of item ((|λ|(v) as integer) + 1) of lst to v
|
||||
end repeat
|
||||
return {item 2 of lst, item 1 of lst}
|
||||
end tell
|
||||
end partition
|
||||
|
||||
-- uncons :: [a] -> Maybe (a, [a])
|
||||
on uncons(xs)
|
||||
if length of xs > 0 then
|
||||
{item 1 of xs, rest of xs}
|
||||
else
|
||||
missing value
|
||||
end if
|
||||
end uncons
|
||||
|
||||
-- Lift 2nd class handler function into 1st class script wrapper
|
||||
-- mReturn :: Handler -> Script
|
||||
on mReturn(f)
|
||||
if class of f is script then
|
||||
f
|
||||
else
|
||||
script
|
||||
property |λ| : f
|
||||
end script
|
||||
end if
|
||||
end mReturn
|
||||
|
|
@ -0,0 +1 @@
|
|||
{5.7, 8.5, 11.8, 14.1, 16.7, 21.3}
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
-- In-place Quicksort (basic algorithm).
|
||||
-- Algorithm: S.A.R. (Tony) Hoare, 1960.
|
||||
on quicksort(theList, l, r) -- Sort items l thru r of theList.
|
||||
set listLength to (count theList)
|
||||
if (listLength < 2) then return
|
||||
-- Convert negative and/or transposed range indices.
|
||||
if (l < 0) then set l to listLength + l + 1
|
||||
if (r < 0) then set r to listLength + r + 1
|
||||
if (l > r) then set {l, r} to {r, l}
|
||||
|
||||
-- Script object containing the list as a property (to allow faster references to its items)
|
||||
-- and the recursive subhandler.
|
||||
script o
|
||||
property lst : theList
|
||||
|
||||
on qsrt(l, r)
|
||||
set pivot to my lst's item ((l + r) div 2)
|
||||
set i to l
|
||||
set j to r
|
||||
repeat until (i > j)
|
||||
set lv to my lst's item i
|
||||
repeat while (pivot > lv)
|
||||
set i to i + 1
|
||||
set lv to my lst's item i
|
||||
end repeat
|
||||
|
||||
set rv to my lst's item j
|
||||
repeat while (rv > pivot)
|
||||
set j to j - 1
|
||||
set rv to my lst's item j
|
||||
end repeat
|
||||
|
||||
if (j > i) then
|
||||
set my lst's item i to rv
|
||||
set my lst's item j to lv
|
||||
else if (i > j) then
|
||||
exit repeat
|
||||
end if
|
||||
|
||||
set i to i + 1
|
||||
set j to j - 1
|
||||
end repeat
|
||||
|
||||
if (j > l) then qsrt(l, j)
|
||||
if (i < r) then qsrt(i, r)
|
||||
end qsrt
|
||||
end script
|
||||
|
||||
tell o to qsrt(l, r)
|
||||
|
||||
return -- nothing.
|
||||
end quicksort
|
||||
property sort : quicksort
|
||||
|
||||
-- Demo:
|
||||
local aList
|
||||
set aList to {28, 9, 95, 22, 67, 55, 20, 41, 60, 53, 100, 72, 19, 67, 14, 42, 29, 20, 74, 39}
|
||||
sort(aList, 1, -1) -- Sort items 1 thru -1 of aList.
|
||||
return aList
|
||||
|
|
@ -0,0 +1 @@
|
|||
{9, 14, 19, 20, 20, 22, 28, 29, 39, 41, 42, 53, 55, 60, 67, 67, 72, 74, 95, 100}
|
||||
Loading…
Add table
Add a link
Reference in a new issue