{{위키데이터 속성 추적}}
{{알고리즘 정보
|그림 = Bogo sort animation.gif
|분류=[[정렬]]
|자료구조=[[배열]]
|최악=무제한 (랜덤화 버전),<ref name="Fun07"/> {{math|''O''((''n''+1)!)}} (결정화 버전)
|평균={{math|''O''((''n''+1)!)}}<ref name="Fun07"/>
|최선={{math|''O''(''n'')}}<ref name="Fun07"/>
|공간복잡도={{math|''O''(1)}}
|optimal=아니오
}}
[[컴퓨터 과학]]에서 '''보고정렬'''(bogosort<ref name="Fun07"/><ref name="KSFS">{{인용
 | last1 = Kiselyov
 | first1 = Oleg
 | last2 = Shan
 | first2 = Chung-chieh
 | last3 = Friedman
 | first3 = Daniel P.
 | last4 = Sabry
 | first4 = Amr
 | contribution = Backtracking, interleaving, and terminating monad transformers: (functional pearl)
 | doi = 10.1145/1086365.1086390
 | pages = 192–203
 | series = SIGPLAN Notices
 | title = Proceedings of the Tenth ACM SIGPLAN International Conference on Functional Programming (ICFP '05)
 | url = http://www.dicta.org.uk/programming/LogicT.pdf
 | year = 2005
 | access-date = 2013-03-31
 | archive-date = 2012-03-26
 | archive-url = https://web.archive.org/web/20120326002456/http://www.dicta.org.uk/programming/LogicT.pdf
 }}</ref>, 또한 '''permutation sort''', '''stupid sort'''<ref>E. S. Raymond. "bogo-sort". ''The New Hacker’s Dictionary''. MIT Press, 1996.</ref> 또는 '''slowsort'''<ref name="Naish86">{{인용
 | last = Naish | first = Lee
 | contribution = Negation and quantifiers in NU-Prolog
 | doi = 10.1007/3-540-16492-8_111
 | pages = 624–634
 | publisher = Springer-Verlag
 | series = Lecture Notes in Computer Science
 | title = Proceedings of the Third International Conference on Logic Programming
 | volume = 225
 | year = 1986}}.</ref><ref name="Naish95">{{인용
 | last = Naish | first = Lee
 | date = June 1995
 | location = Melbourne, Australia
 | publisher = Department of Computer Science, University of Melbourne
 | series = Tech. Report 95/16
 | title = Pruning in logic programming
 | id = {{citeseerx|10.1.1.54.2347}} }}.</ref>)은 [[정렬 알고리즘]] 중 하나로 비효율적인 것에 속한다. 보고 정렬의 이름은 단어 "bogus"에서 유래된다. 보고정렬은 정렬하는데 유용하게 사용되지는 않지만, 실제로 사용되는 알고리즘과 비교를 통한 교육에서 사용될 수 있다. 또한 논리형 프로그래밍의 예시로서 사용되기도 한다. 만약 보고 정렬이 카드 뭉치를 정렬하는데 사용될 때 시행되는 과정은 다음과 같다.

== 의사 코드 ==
;영어
 '''while not''' isInOrder(list):
     shuffle(list)
;한국어
 (리스트가 배열될 때)'''까지 실행하기''':
     리스트 '''섞기'''

== 예시 ==
[[표준 ML]]의 셔플을 사용한 코드 예는 아래와 같다.

<syntaxhighlight lang="sml">
 val _ = load "Random";
 load "Int";
 val rng = Random.newgen ();

 fun select (y::xs, 0) = (y, xs)
   | select (x::xs, i) = let val (y, xs') = select (xs, i-1) in (y, x::xs') end
   | select (_, i) = raise Fail ("Short by " ^ Int.toString i ^ " elements.");

 (* Recreates a list in random order by removing elements in random positions *)
 fun shuffle xs =
    let fun rtake [] _ = []
          | rtake ys max =
             let val (y, ys') = select (ys, Random.range (0, max) rng)
             in y :: rtake ys' (max-1)
             end
    in rtake xs (length xs) end;

 fun bogosort xs comp = 
 let fun isSorted (x::y::xs) comp = comp(x,y) <> GREATER andalso isSorted (y::xs) comp
       | isSorted _ comp = true;
     val a = ref xs;
 in while(not(isSorted (!a) comp)) do (
  a := shuffle (!a)
  ); (!a) end;
</syntaxhighlight>

== [[런타임]] 및 종결 ==
만약 정렬해야하는 원소들이 각각 독립되어 있다면, 평균적으로 시행되는 비교 횟수는 <math>(e-1) n!</math>회이며, 평균적으로 시행되는 섞음의 횟수는 <math>(n-1) n!</math>회이다.<ref name="Fun07">{{인용
 | last1 = Gruber | first1 = H.
 | last2 = Holzer | first2 = M.
 | last3 = Ruepp | first3 = O.
 | contribution = Sorting the slow way: an analysis of perversely awful randomized sorting algorithms
 | doi = 10.1007/978-3-540-72914-3_17
 | pages = 183–197
 | publisher = Springer-Verlag
 | series = Lecture Notes in Computer Science
 | title = 4th International Conference on Fun with Algorithms, Castiglioncello, Italy, 2007
 | url = http://www.hermann-gruber.com/data/fun07-final.pdf
 | volume = 4475}}.</ref>
평균적으로 시행되는 섞음의 횟수는 비교 횟수보다 빨리 증가한다. 이는 원소들이 순서대로 정렬되어있지 않을 경우, 적은 횟수의 비교 끝에 바로 정렬되지 않은 상태라는 것이 발견되지만, 섞음의 횟수는 이와 다르게 정렬해야 하는 배열의 크기에 비례하기 때문이다. 최악의 경우, 비교의 횟수와 섞음의 횟수에는 끝이 없으며, 이는 동전을 던졌을 때 앞면이 계속 나올 수 있는 것과 같은 원리이다. 최선의 경우는 주어진 배열이 이미 정렬되어 있는 경우이다. 이때 시행되는 비교의 횟수는 <math>n-1</math>회이며, 섞음은 단 한번도 시행되지 않는다.<ref name="Fun07"/>

한정된 개수의 숫자 배열에 대하여 이 알고리즘의 [[런타임]]은 유한하다. 이는 [[무한 원숭이 정리]]에 기반하여 내릴 수 있는 결론이며, 섞음 후 정렬된 배열이 나올 수 있는 확률이 조금이라도 있기에, 여러번의 수행은 거의 확실히 정렬된 배열을 만들어 낼 수 있다. 하지만 랜덤한 섞음이 아닌 [[유사난수]] 생성기를 이용하여 섞음이 시행된다면 이 알고리즘에는 끝이 없을 수도 있다.

== 같이 보기 ==
* [[꼭두각시 정렬]]
== 각주 ==
{{각주}}

== 외부 링크 ==
{{위키책|Algorithm Implementation|Sorting/Bogosort|Bogosort}}
* [[c2:BogoSort|BogoSort]] on [[WikiWikiWeb]]
* [https://web.archive.org/web/20131210012102/http://richardhartersworld.com/cri_d/cri/2001/badsort.html 비효율적 정렬 알고리즘]
* [http://www.lysator.liu.se/~qha/bogosort/ Bogosort]: an implementation that runs on [[Unix-like]] systems, similar to the standard [[sort (Unix)|sort]] program.
* [https://archive.today/20130103015524/http://github.com/versesane/algorithms-and-data-structures-in-c/tree/master/bogosort.c Bogosort] and [http://libjmmcg.cvs.sourceforge.net/viewvc/libjmmcg/libjmmcg/core/bogo_sort.hpp jmmcg::bogosort]{{깨진 링크|url=http://libjmmcg.cvs.sourceforge.net/viewvc/libjmmcg/libjmmcg/core/bogo_sort.hpp }}: Simple, yet perverse, C++ implementations of the bogosort algorithm.

{{정렬 알고리즘}}

[[분류:정렬 알고리즘]]
[[분류:비교 정렬]]
[[분류:컴퓨터 유머]]