Sorting algorithms/Bogosort: Difference between revisions

From Rosetta Code
Content added Content deleted
(Added Java)
Line 1: Line 1:
{{task}}Bogosort a list of numbers, Bogosort means to iterate through every permutation until you find one which is sorted.
{{task}}{{Sorting Algorithm}}Bogosort a list of numbers. Bogosort simply shuffles a collection until it is sorted.

Pseudocode:
while not InOrder(list) do Shuffle(list);


=={{header|Haskell}}==
=={{header|Haskell}}==
Line 18: Line 21:
do { t' <- insert e t ; return (h : t') }
do { t' <- insert e t ; return (h : t') }
</pre>
</pre>

=={{header|Java}}==
{{works with|Java|1.5+}}
<java>import java.util.Collections;
import java.util.LinkedList;

public class Bogosort<T extends Comparable<T>> {
public LinkedList<T> bogoSort(LinkedList<T> list){
boolean sorted= false;
while(!sorted){
sorted= true;
for(int i= 0;i < list.size() - 1;i++){
if(list.get(i).compareTo(list.get(i + 1)) > 0){
sorted= false;
}
}

if(!sorted){
Collections.shuffle(list);
}
}
return list;
}
}</java>



=={{header|Prolog}}==
=={{header|Prolog}}==

Revision as of 01:34, 7 May 2008

Task
Sorting algorithms/Bogosort
You are encouraged to solve this task according to the task description, using any language you may know.

Bogosort a list of numbers. Bogosort simply shuffles a collection until it is sorted.

Pseudocode:

while not InOrder(list) do Shuffle(list);

Haskell

import Control.Monad

bogosort l           = head $ do p <- permute l
                                 if sorted p then return p else mzero

sorted (e1 : e2 : r) = e1 <= e2 && sorted (e2 : r)
sorted _             = True

permute []           = return []
permute (h:t)        = do { t' <- permute t ; insert h t' }

insert e []          = return [e]
insert e l@(h : t)   = return (e : l) `mplus`
                       do { t' <- insert e t ; return (h : t') }

Java

Works with: Java version 1.5+

<java>import java.util.Collections; import java.util.LinkedList;

public class Bogosort<T extends Comparable<T>> { public LinkedList<T> bogoSort(LinkedList<T> list){ boolean sorted= false; while(!sorted){ sorted= true; for(int i= 0;i < list.size() - 1;i++){ if(list.get(i).compareTo(list.get(i + 1)) > 0){ sorted= false; } }

if(!sorted){ Collections.shuffle(list); } } return list; } }</java>


Prolog

bogosort(L,S) :- permutation(L,S), sorted(S).

sorted([]).
sorted([_]).
sorted([X,Y|ZS]) :- X =< Y, sorted([Y|ZS]).

permutation([],[]).
permutation([X|XS],YS) :- permutation(XS,ZS), select(X,YS,ZS).

Scheme

<scheme> (define (insertions e list)

 (if (null? list)
     (cons (cons e list) list)
     (cons (cons e list)
           (map (lambda (tail) (cons (car list) tail))
                (insertions e (cdr list))))))

(define (permutations list)

 (if (null? list)
     (cons list list)
     (apply append (map (lambda (permutation)
                          (insertions (car list) permutation))
                        (permutations (cdr list))))))

(define (sorted? list)

 (cond ((null? list) #t)
       ((null? (cdr list)) #t)
       ((<= (car list) (cadr list)) (sorted? (cdr list)))
       (else #f)))

(define (bogosort list)

 (let loop ((permutations (permutations list)))
   (if (sorted? (car permutations))
       (car permutations)
       (loop (cdr permutations)))))

</scheme>