Stooge sort explained

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 running time of the algorithm is thus slower compared to reasonable sorting algorithms, and is slower than bubble sort, a canonical example of a fairly inefficient sort. It is however more efficient than Slowsort. The name comes from The Three Stooges.[1]

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.

Implementation

Pseudocode

function stoogesort(array L, i = 0, j = length(L)-1)

Haskell

-- Not the best but equal to above

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

0 = value : xs | otherwise = x : replaceAt xs (index - 1) value

References

  1. Web site: CSE 373 . courses.cs.washington.edu. PDF. 2020-09-14.

Sources

External links