Sorting algorithms/Permutation sort: Difference between revisions

From Rosetta Code
Content added Content deleted
(Shuffle isn't the same as try another permutation that hasn't been tried before)
(added C++)
Line 3: Line 3:
Pseudocode:
Pseudocode:
while not InOrder(list) do newPermutation(list);
while not InOrder(list) do newPermutation(list);

=={{header|C++}}==
Since <code>next_permutation</code> already returns whether the resulting sequence is sorted, the code is quite simple:

<cpp>
#include <algorithm>

template<typename ForwardIterator>
void permutation_sort(ForwardIterator begin, ForwardIterator end)
{
while (std::next_permutation(begin, end))
{
// -- this block intentionally left empty --
}
}
</cpp>


=={{header|Haskell}}==
=={{header|Haskell}}==

Revision as of 19:24, 8 May 2008

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

Permutation sort.

Pseudocode:

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

C++

Since next_permutation already returns whether the resulting sequence is sorted, the code is quite simple:

<cpp>

  1. include <algorithm>

template<typename ForwardIterator>

void permutation_sort(ForwardIterator begin, ForwardIterator end)

{

 while (std::next_permutation(begin, end))
 {
   // -- this block intentionally left empty --
 }

} </cpp>

Haskell

import Control.Monad

permutationSort 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') }

Prolog

permutation_sort(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 (permutation-sort list)

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

</scheme>