Class: | Sorting algorithm |
Data: | Array |
Time: | O(nlog) |
Space: | O(n) |
Stooge sort is a recursive sorting algorithm. It is notable for its exceptionally bad time complexity of
O(nlog)
O(n2.7095...)
The algorithm is defined as follows:
It is important to get the integer sort size used in the recursive calls by rounding the 2/3 upwards, e.g. rounding 2/3 of 5 should give 4 rather than 3, as otherwise the sort can fail on certain data.
stoogesort :: (Ord a) => [a] -> [a]stoogesort [] = []stoogesort src = innerStoogesort src 0 ((length src) - 1)
innerStoogesort :: (Ord a) => [a] -> Int -> Int -> [a]innerStoogesort src i j | (j - i + 1) > 2 = src' | otherwise = src' where src' = swap src i j -- need every call t = floor (fromIntegral (j - i + 1) / 3.0) src = innerStoogesort src' i (j - t) src = innerStoogesort src (i + t) j src' = innerStoogesort src i (j - t)
swap :: (Ord a) => [a] -> Int -> Int -> [a]swap src i j | a > b = replaceAt (replaceAt src j a) i b | otherwise = src where a = src !! i b = src !! j
replaceAt :: [a] -> Int -> a -> [a]replaceAt (x:xs) index value | index