느린 정렬 또는 슬로소트(slowsort)는 정렬 알고리즘의 하나이다. 유머에서 기인한 정렬이며 유용성이 없다. 증식 항복(multiply and surrender)의 원리에 기반한, 사용이 꺼려지는 알고리즘이다. (분할 정복 알고리즘의 반의어를 취한 패러디) 1986년에 안드레이 브로더(Andrei Broder)와 조지 스톨피(Jorge Stolfi)가 출판한 논문 "최악 알고리즘과 단순성 분석"(Pessimal Algorithms and Simplexity Analysis)에서 소개되었다.[1] (이 논문의 제목은 최적 알고리즘(Optimal Algorithm)과 복잡도 분석(Complexity Analysis)을 패러디했다.)
느린 정렬은 재귀 알고리즘이다.
의사 코드의 구현체는 다음과 같다.
procedure slowsort(A[], i, j) // Sort array range A[i ... j] in-place.
if i ≥ j then
return
m := floor( (i+j)/2 )
slowsort(A, i, m) // (1.1)
slowsort(A, m+1, j) // (1.2)
if A[j] < A[m] then
swap A[j] , A[m] // (1.3)
slowsort(A, i, j-1) // (2)
하스켈의 최적화되지 않은 구현체(순수 함수)는 다음과 같다:
slowsort :: (Ord a) => [a] -> [a]
slowsort xs
| length xs <= 1 = xs
| otherwise = slowsort xs' ++ [max llast rlast] -- (2)
where m = length xs `div` 2
l = slowsort $ take m xs -- (1.1)
r = slowsort $ drop m xs -- (1.2)
llast = last l
rlast = last r
xs' = init l ++ min llast rlast : init r
느린 정렬의 실행 시간 은 로, (OEIS의 수열 A178855)와 같다.
최상의 조건을 갖추었다고 해도 거품 정렬보다도 속도가 더 느리다.