all tasks
This commit is contained in:
parent
b83f433714
commit
68f8f3e56b
14735 changed files with 178959 additions and 0 deletions
11
Task/Sorting-algorithms-Bogosort/0DESCRIPTION
Normal file
11
Task/Sorting-algorithms-Bogosort/0DESCRIPTION
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{{Sorting Algorithm}}
|
||||
[[wp:Bogosort|Bogosort]] a list of numbers. Bogosort simply shuffles a collection randomly until it is sorted.
|
||||
|
||||
"Bogosort" is a perversely inefficient algorithm only used as an in-joke. Its average run-time is O(n!) because the chance that any given shuffle of a set will end up in sorted order is about one in ''n'' factorial, and the worst case is infinite since there's no guarantee that a random shuffling will ever produce a sorted sequence. Its best case is O(n) since a single pass through the elements may suffice to order them.
|
||||
|
||||
Pseudocode:
|
||||
'''while not''' InOrder(list) '''do'''
|
||||
Shuffle(list)
|
||||
'''done'''
|
||||
|
||||
The [[Knuth shuffle]] may be used to implement the shuffle part of this algorithm.
|
||||
2
Task/Sorting-algorithms-Bogosort/1META.yaml
Normal file
2
Task/Sorting-algorithms-Bogosort/1META.yaml
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
---
|
||||
note: Sorting Algorithms
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
MODE TYPE = INT;
|
||||
|
||||
PROC random shuffle = (REF[]TYPE l)VOID: (
|
||||
INT range = UPB l - LWB l + 1;
|
||||
FOR index FROM LWB l TO UPB l DO
|
||||
TYPE tmp := l[index];
|
||||
INT other := ENTIER (LWB l + random * range);
|
||||
l[index] := l[other];
|
||||
l[other] := tmp
|
||||
OD
|
||||
);
|
||||
|
||||
PROC in order = (REF[]TYPE l)BOOL: (
|
||||
IF LWB l >= UPB l THEN
|
||||
TRUE
|
||||
ELSE
|
||||
TYPE last := l[LWB l];
|
||||
FOR index FROM LWB l + 1 TO UPB l DO
|
||||
IF l[index] < last THEN
|
||||
GO TO return false
|
||||
FI;
|
||||
last := l[index]
|
||||
OD;
|
||||
TRUE EXIT
|
||||
return false: FALSE
|
||||
FI
|
||||
);
|
||||
|
||||
PROC bogo sort = (REF[]TYPE l)REF[]TYPE: (
|
||||
WHILE NOT in order(l) DO
|
||||
random shuffle(l)
|
||||
OD;
|
||||
l
|
||||
);
|
||||
|
||||
[6]TYPE sample := (61, 52, 63, 94, 46, 18);
|
||||
print((bogo sort(sample), new line))
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
function randint(n)
|
||||
{
|
||||
return int(n * rand())
|
||||
}
|
||||
|
||||
function sorted(sa, sn)
|
||||
{
|
||||
for(si=1; si < sn; si++) {
|
||||
if ( sa[si] > sa[si+1] ) return 0;
|
||||
}
|
||||
return 1
|
||||
}
|
||||
|
||||
{
|
||||
line[NR] = $0
|
||||
}
|
||||
END { # sort it with bogo sort
|
||||
while ( sorted(line, NR) == 0 ) {
|
||||
for(i=1; i <= NR; i++) {
|
||||
r = randint(NR) + 1
|
||||
t = line[i]
|
||||
line[i] = line[r]
|
||||
line[r] = t
|
||||
}
|
||||
}
|
||||
#print it
|
||||
for(i=1; i <= NR; i++) {
|
||||
print line[i]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
public function bogoSort(arr:Array):Array
|
||||
{
|
||||
while (!sorted(arr))
|
||||
{
|
||||
shuffle(arr);
|
||||
}
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
public function shuffle(arr:Array):void
|
||||
{
|
||||
for (var i:int = 0; i < arr.length; i++)
|
||||
{
|
||||
var rand:int = Math.floor(Math.random() * arr.length);
|
||||
var tmp:* = arr[i];
|
||||
arr[i] = arr[rand];
|
||||
arr[rand] = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
public function sorted(arr:Array):Boolean
|
||||
{
|
||||
var last:int = arr[0];
|
||||
|
||||
for (var i:int = 1; i < arr.length; i++)
|
||||
{
|
||||
if (arr[i] < last)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
last = arr[i];
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
with Ada.Numerics.Discrete_Random;
|
||||
|
||||
procedure Test_Bogosort is
|
||||
generic
|
||||
type Ordered is private;
|
||||
type List is array (Positive range <>) of Ordered;
|
||||
with function "<" (L, R : Ordered) return Boolean is <>;
|
||||
procedure Bogosort (Data : in out List);
|
||||
|
||||
procedure Bogosort (Data : in out List) is
|
||||
function Sorted return Boolean is
|
||||
begin
|
||||
for I in Data'First..Data'Last - 1 loop
|
||||
if not (Data (I) < Data (I + 1)) then
|
||||
return False;
|
||||
end if;
|
||||
end loop;
|
||||
return True;
|
||||
end Sorted;
|
||||
subtype Index is Integer range Data'Range;
|
||||
package Dices is new Ada.Numerics.Discrete_Random (Index);
|
||||
use Dices;
|
||||
Dice : Generator;
|
||||
procedure Shuffle is
|
||||
J : Index;
|
||||
Temp : Ordered;
|
||||
begin
|
||||
for I in Data'Range loop
|
||||
J := Random (Dice);
|
||||
Temp := Data (I);
|
||||
Data (I) := Data (J);
|
||||
Data (J) := Temp;
|
||||
end loop;
|
||||
end Shuffle;
|
||||
begin
|
||||
while not Sorted loop
|
||||
Shuffle;
|
||||
end loop;
|
||||
end Bogosort;
|
||||
|
||||
type List is array (Positive range <>) of Integer;
|
||||
procedure Integer_Bogosort is new Bogosort (Integer, List);
|
||||
Sequence : List := (7,6,3,9);
|
||||
begin
|
||||
Integer_Bogosort (Sequence);
|
||||
for I in Sequence'Range loop
|
||||
Put (Integer'Image (Sequence (I)));
|
||||
end loop;
|
||||
end Test_Bogosort;
|
||||
|
|
@ -0,0 +1,34 @@
|
|||
MsgBox % Bogosort("987654")
|
||||
MsgBox % Bogosort("319208")
|
||||
MsgBox % Bogosort("fedcba")
|
||||
MsgBox % Bogosort("gikhjl")
|
||||
|
||||
Bogosort(sequence) {
|
||||
While !Sorted(sequence)
|
||||
sequence := Shuffle(sequence)
|
||||
Return sequence
|
||||
}
|
||||
|
||||
Sorted(sequence) {
|
||||
Loop, Parse, sequence
|
||||
{
|
||||
current := A_LoopField
|
||||
rest := SubStr(sequence, A_Index)
|
||||
Loop, Parse, rest
|
||||
{
|
||||
If (current > A_LoopField)
|
||||
Return false
|
||||
}
|
||||
}
|
||||
Return true
|
||||
}
|
||||
|
||||
Shuffle(sequence) {
|
||||
Max := StrLen(sequence) + 1
|
||||
Loop % StrLen(sequence) {
|
||||
Random, Num, 1, % Max - A_Index
|
||||
Found .= SubStr(sequence, Num, 1)
|
||||
sequence := SubStr(sequence, 1, Num-1) . SubStr(sequence, Num+1)
|
||||
}
|
||||
Return Found
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
DIM test(9)
|
||||
test() = 4, 65, 2, 31, 0, 99, 2, 83, 782, 1
|
||||
|
||||
shuffles% = 0
|
||||
WHILE NOT FNsorted(test())
|
||||
shuffles% += 1
|
||||
PROCshuffle(test())
|
||||
ENDWHILE
|
||||
PRINT ;shuffles% " shuffles required to sort "; DIM(test(),1)+1 " items."
|
||||
END
|
||||
|
||||
DEF PROCshuffle(d())
|
||||
LOCAL I%
|
||||
FOR I% = DIM(d(),1)+1 TO 2 STEP -1
|
||||
SWAP d(I%-1), d(RND(I%)-1)
|
||||
NEXT
|
||||
ENDPROC
|
||||
|
||||
DEF FNsorted(d())
|
||||
LOCAL I%
|
||||
FOR I% = 1 TO DIM(d(),1)
|
||||
IF d(I%) < d(I%-1) THEN = FALSE
|
||||
NEXT
|
||||
= TRUE
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
bogosort = { list |
|
||||
sorted = list.sort #Kinda cheating here
|
||||
while { list != sorted } { list.shuffle! }
|
||||
list
|
||||
}
|
||||
|
||||
p bogosort [15 6 2 9 1 3 41 19]
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
#include <iterator>
|
||||
#include <algorithm>
|
||||
|
||||
template<typename ForwardIterator>
|
||||
void bogosort(ForwardIterator begin, ForwardIterator end)
|
||||
{
|
||||
typedef std::iterator_traits<ForwardIterator>::value_type value_type;
|
||||
|
||||
// if we find two adjacent values where the first is greater than the second, the sequence isn't sorted.
|
||||
while (std::adjacent_find(begin, end, std::greater<value_type>()) != end)
|
||||
std::random_shuffle(begin, end);
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
#include <algorithm>
|
||||
#include <ext/algorithm>
|
||||
|
||||
template<typename ForwardIterator>
|
||||
void bogosort(ForwardIterator begin, ForwardIterator end)
|
||||
{
|
||||
while (!__gnu_cxx::is_sorted(begin, end))
|
||||
std::random_shuffle(begin, end);
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
bool is_sorted(int *a, int n)
|
||||
{
|
||||
while ( --n >= 1 ) {
|
||||
if ( a[n] < a[n-1] ) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void shuffle(int *a, int n)
|
||||
{
|
||||
int i, t, r;
|
||||
for(i=0; i < n; i++) {
|
||||
t = a[i];
|
||||
r = rand() % n;
|
||||
a[i] = a[r];
|
||||
a[r] = t;
|
||||
}
|
||||
}
|
||||
|
||||
void bogosort(int *a, int n)
|
||||
{
|
||||
while ( !is_sorted(a, n) ) shuffle(a, n);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
int numbers[] = { 1, 10, 9, 7, 3, 0 };
|
||||
int i;
|
||||
|
||||
bogosort(numbers, 6);
|
||||
for (i=0; i < 6; i++) printf("%d ", numbers[i]);
|
||||
printf("\n");
|
||||
}
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
(ns bogosort
|
||||
(:use [clojure.contrib.seq-utils :only (shuffle)]))
|
||||
|
||||
(defn in-order? [less xs]
|
||||
(or (empty? xs)
|
||||
(empty? (next xs))
|
||||
(and (less (first xs) (second xs))
|
||||
(recur less (next xs)))))
|
||||
|
||||
(defn bogosort
|
||||
([xs]
|
||||
(bogosort < xs))
|
||||
([less xs]
|
||||
(if (in-order? less xs) xs
|
||||
(recur less (shuffle xs)))))
|
||||
|
||||
(println (bogosort [7,5,12,1,4,2,23,18]))
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
(defun nshuffle (sequence)
|
||||
(loop for i from (length sequence) downto 2
|
||||
do (rotatef (elt sequence (random i))
|
||||
(elt sequence (1- i ))))
|
||||
sequence)
|
||||
|
||||
(defun sortedp (list predicate)
|
||||
(every predicate list (rest list)))
|
||||
|
||||
(defun bogosort (list predicate)
|
||||
(do ((list list (nshuffle list)))
|
||||
((sortedp list predicate) list)))
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
import std.stdio, std.algorithm, std.random;
|
||||
|
||||
void bogoSort(T)(T[] data) {
|
||||
while (!isSorted(data))
|
||||
randomShuffle(data);
|
||||
}
|
||||
|
||||
void main() {
|
||||
auto array = [2, 7, 41, 11, 3, 1, 6, 5, 8];
|
||||
bogoSort(array);
|
||||
writeln(array);
|
||||
}
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
def isSorted(list) {
|
||||
if (list.size() == 0) { return true }
|
||||
var a := list[0]
|
||||
for i in 1..!(list.size()) {
|
||||
var b := list[i]
|
||||
if (a > b) { return false }
|
||||
a := b
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
def bogosort(list, random) {
|
||||
while (!isSorted(list)) {
|
||||
shuffle(list, random)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
function shuffle(sequence s)
|
||||
object temp
|
||||
integer j
|
||||
for i = length(s) to 1 by -1 do
|
||||
j = rand(i)
|
||||
if i != j then
|
||||
temp = s[i]
|
||||
s[i] = s[j]
|
||||
s[j] = temp
|
||||
end if
|
||||
end for
|
||||
return s
|
||||
end function
|
||||
|
||||
function inOrder(sequence s)
|
||||
for i = 1 to length(s)-1 do
|
||||
if compare(s[i],s[i+1]) > 0 then
|
||||
return 0
|
||||
end if
|
||||
end for
|
||||
return 1
|
||||
end function
|
||||
|
||||
function bogosort(sequence s)
|
||||
while not inOrder(s) do
|
||||
? s
|
||||
s = shuffle(s)
|
||||
end while
|
||||
return s
|
||||
end function
|
||||
|
||||
? bogosort(shuffle({1,2,3,4,5,6}))
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
USING: grouping kernel math random sequences ;
|
||||
|
||||
: sorted? ( seq -- ? ) 2 <clumps> [ first2 <= ] all? ;
|
||||
: bogosort ( seq -- newseq ) [ dup sorted? ] [ randomize ] until ;
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
class Main
|
||||
{
|
||||
Bool in_order (Int[] items)
|
||||
{
|
||||
(0..<(items.size-1)).toList.all |Int i -> Bool|
|
||||
{
|
||||
items[i] <= items[i+1]
|
||||
}
|
||||
}
|
||||
|
||||
Int[] bogosort (Int[] items)
|
||||
{
|
||||
while (!in_order(items))
|
||||
{
|
||||
items.shuffle
|
||||
}
|
||||
return items
|
||||
}
|
||||
|
||||
Void main ()
|
||||
{
|
||||
// example
|
||||
echo ("Sorting [3,4,2,1] gives " + bogosort ([3,4,2,1]))
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
MODULE BOGO
|
||||
IMPLICIT NONE
|
||||
CONTAINS
|
||||
FUNCTION Sorted(a)
|
||||
LOGICAL :: Sorted
|
||||
INTEGER, INTENT(IN) :: a(:)
|
||||
INTEGER :: i
|
||||
|
||||
Sorted = .TRUE.
|
||||
DO i = 1, SIZE(a)-1
|
||||
IF(a(i) > a(i+1)) THEN
|
||||
Sorted = .FALSE.
|
||||
EXIT
|
||||
END IF
|
||||
END DO
|
||||
END FUNCTION Sorted
|
||||
|
||||
SUBROUTINE SHUFFLE(a)
|
||||
INTEGER, INTENT(IN OUT) :: a(:)
|
||||
INTEGER :: i, rand, temp
|
||||
REAL :: x
|
||||
|
||||
DO i = SIZE(a), 1, -1
|
||||
CALL RANDOM_NUMBER(x)
|
||||
rand = INT(x * i) + 1
|
||||
temp = a(rand)
|
||||
a(rand) = a(i)
|
||||
a(i) = temp
|
||||
END DO
|
||||
END SUBROUTINE
|
||||
END MODULE
|
||||
|
||||
PROGRAM BOGOSORT
|
||||
|
||||
USE BOGO
|
||||
IMPLICIT NONE
|
||||
INTEGER :: iter = 0
|
||||
INTEGER :: array(8) = (/2, 7, 5, 3, 4, 8, 6, 1/)
|
||||
LOGICAL :: s
|
||||
|
||||
DO
|
||||
s = Sorted(array)
|
||||
IF (s) EXIT
|
||||
CALL SHUFFLE(array)
|
||||
iter = iter + 1
|
||||
END DO
|
||||
WRITE (*,*) "Array required", iter, " shuffles to sort"
|
||||
|
||||
END PROGRAM BOGOSORT
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"sort"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
list := []int{31, 41, 59, 26, 53, 58, 97, 93, 23, 84}
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
fmt.Println("unsorted:", list)
|
||||
temp := make([]int, len(list))
|
||||
copy(temp, list)
|
||||
for !sort.IntsAreSorted(temp) {
|
||||
for i, v := range rand.Perm(len(list)) {
|
||||
temp[i] = list[v]
|
||||
}
|
||||
}
|
||||
fmt.Println("sorted! ", temp)
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
def bogosort = { list ->
|
||||
def n = list.size()
|
||||
while (n > 1 && (1..<n).any{ list[it-1] > list[it] }) {
|
||||
print '.'*n
|
||||
Collections.shuffle(list)
|
||||
}
|
||||
list
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
println (bogosort([3,1,2]))
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
import System.Random
|
||||
import Data.Array.IO
|
||||
import Control.Monad
|
||||
|
||||
isSorted :: (Ord a) => [a] -> Bool
|
||||
isSorted (e1:e2:r) = e1 <= e2 && isSorted (e2:r)
|
||||
isSorted _ = True
|
||||
|
||||
-- from http://www.haskell.org/haskellwiki/Random_shuffle
|
||||
shuffle :: [a] -> IO [a]
|
||||
shuffle xs = do
|
||||
ar <- newArray n xs
|
||||
forM [1..n] $ \i -> do
|
||||
j <- randomRIO (i,n)
|
||||
vi <- readArray ar i
|
||||
vj <- readArray ar j
|
||||
writeArray ar j vi
|
||||
return vj
|
||||
where
|
||||
n = length xs
|
||||
newArray :: Int -> [a] -> IO (IOArray Int a)
|
||||
newArray n xs = newListArray (1,n) xs
|
||||
|
||||
bogosort :: (Ord a) => [a] -> IO [a]
|
||||
bogosort li | isSorted li = return li
|
||||
| otherwise = shuffle li >>= bogosort
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
procedure shuffle(l)
|
||||
repeat {
|
||||
!l :=: ?l
|
||||
suspend l
|
||||
}
|
||||
end
|
||||
|
||||
procedure sorted(l)
|
||||
local i
|
||||
if (i := 2 to *l & l[i] >= l[i-1]) then return &fail else return 1
|
||||
end
|
||||
|
||||
procedure main()
|
||||
local l
|
||||
l := [6,3,4,5,1]
|
||||
|( shuffle(l) & sorted(l)) \1 & every writes(" ",!l)
|
||||
end
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
[ shuffle a n i j tmp;
|
||||
for(i = n - 1: i > 0: i--)
|
||||
{
|
||||
j = random(i + 1) - 1;
|
||||
|
||||
tmp = a->j;
|
||||
a->j = a->i;
|
||||
a->i = tmp;
|
||||
}
|
||||
];
|
||||
|
||||
[ is_sorted a n i;
|
||||
for(i = 0: i < n - 1: i++)
|
||||
{
|
||||
if(a->i > a->(i + 1)) rfalse;
|
||||
}
|
||||
|
||||
rtrue;
|
||||
];
|
||||
|
||||
[ bogosort a n;
|
||||
while(~~is_sorted(a, n))
|
||||
{
|
||||
shuffle(a, n);
|
||||
}
|
||||
];
|
||||
|
|
@ -0,0 +1,17 @@
|
|||
List do(
|
||||
isSorted := method(
|
||||
slice(1) foreach(i, x,
|
||||
if (x < at(i), return false)
|
||||
)
|
||||
return true;
|
||||
)
|
||||
|
||||
bogoSortInPlace := method(
|
||||
while(isSorted not,
|
||||
shuffleInPlace()
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
lst := list(2, 1, 4, 3)
|
||||
lst bogoSortInPlace println # ==> list(1, 2, 3, 4), hopefully :)
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
bogo=: monad define
|
||||
whilst. +./ 2 >/\ Ry do. Ry=. (A.~ ?@!@#) y end. Ry
|
||||
)
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Iterator;
|
||||
|
||||
public class Bogosort {
|
||||
private static <T extends Comparable<? super T>> boolean isSorted(List<T> list) {
|
||||
if (list.isEmpty())
|
||||
return true;
|
||||
Iterator<T> it = list.iterator();
|
||||
T last = it.next();
|
||||
while (it.hasNext()) {
|
||||
T current = it.next();
|
||||
if (last.compareTo(current) > 0)
|
||||
return false;
|
||||
last = current;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static <T extends Comparable<? super T>> void bogoSort(List<T> list) {
|
||||
while (!isSorted(list))
|
||||
Collections.shuffle(list);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
shuffle = function(v) {
|
||||
for(var j, x, i = v.length; i; j = Math.floor(Math.random() * i), x = v[--i], v[i] = v[j], v[j] = x);
|
||||
return v;
|
||||
};
|
||||
|
||||
isSorted = function(v){
|
||||
for(var i=1; i<v.length; i++) {
|
||||
if (v[i-1] > v[i]) { return false; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bogosort = function(v){
|
||||
var sorted = false;
|
||||
while(sorted == false){
|
||||
v = shuffle(v);
|
||||
sorted = isSorted(v);
|
||||
}
|
||||
return v;
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
function bogosort (list)
|
||||
if type (list) ~= 'table' then return list end
|
||||
|
||||
-- Fisher-Yates Knuth shuffle
|
||||
local function shuffle ()
|
||||
local rand = math.random(1,#list)
|
||||
for i=1,#list do
|
||||
list[i],list[rand] = list[rand],list[i]
|
||||
rand = math.random(1,#list)
|
||||
end
|
||||
end
|
||||
|
||||
-- Returns true only if list is now sorted
|
||||
local function in_order ()
|
||||
local last = list[1]
|
||||
for i,v in next,list do
|
||||
if v < last then return false end
|
||||
last = v
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
while not in_order() do shuffle() end
|
||||
|
||||
return list
|
||||
end
|
||||
|
|
@ -0,0 +1,40 @@
|
|||
divert(-1)
|
||||
define(`randSeed',141592653)
|
||||
define(`setRand',
|
||||
`define(`randSeed',ifelse(eval($1<10000),1,`eval(20000-$1)',`$1'))')
|
||||
define(`rand_t',`eval(randSeed^(randSeed>>13))')
|
||||
define(`random',
|
||||
`define(`randSeed',eval((rand_t^(rand_t<<18))&0x7fffffff))randSeed')
|
||||
define(`for',
|
||||
`ifelse($#,0,``$0'',
|
||||
`ifelse(eval($2<=$3),1,
|
||||
`pushdef(`$1',$2)$4`'popdef(`$1')$0(`$1',incr($2),$3,`$4')')')')
|
||||
define(`set',`define(`$1[$2]',`$3')')
|
||||
define(`new',`set($1,size,0)')
|
||||
define(`get',`defn($1[$2])')
|
||||
define(`append',
|
||||
`set($1,size,incr(get($1,size)))`'set($1,get($1,size),$2)')
|
||||
define(`deck',
|
||||
`new($1)for(`x',1,$2,
|
||||
`append(`$1',random)')')
|
||||
define(`show',
|
||||
`for(`x',1,get($1,size),`get($1,x)`'ifelse(x,get($1,size),`',`, ')')')
|
||||
define(`swap',`set($1,$2,get($1,$4))`'set($1,$4,$3)')
|
||||
define(`shuffle',
|
||||
`for(`x',1,get($1,size),
|
||||
`swap($1,x,get($1,x),eval(1+random%get($1,size)))')')
|
||||
define(`inordern',
|
||||
`ifelse(eval($2>=get($1,size)),1,
|
||||
1,
|
||||
`ifelse(eval(get($1,$2)>get($1,incr($2))),1,
|
||||
0,
|
||||
`inordern(`$1',incr($2))')')')
|
||||
define(`inorder',`inordern($1,1)')
|
||||
define(`bogosort',
|
||||
`ifelse(inorder(`$1'),0,`nope shuffle(`$1')`'bogosort(`$1')')')
|
||||
divert
|
||||
|
||||
deck(`b',6)
|
||||
show(`b')
|
||||
bogosort(`b')
|
||||
show(`b')
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
function list = bogoSort(list)
|
||||
while( ~issorted(list) ) %Check to see if it is sorted
|
||||
list = list( randperm(numel(list)) ); %Randomly sort the list
|
||||
end
|
||||
end
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
bogoSort([5 3 8 4 9 7 6 2 1])
|
||||
|
||||
ans =
|
||||
|
||||
1 2 3 4 5 6 7 8 9
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
fn notSorted arr =
|
||||
(
|
||||
if arr.count > 0 then
|
||||
(
|
||||
local current = arr[1]
|
||||
for i in 2 to arr.count do
|
||||
(
|
||||
if current > arr[i] then
|
||||
(
|
||||
return true
|
||||
)
|
||||
current = arr[i]
|
||||
)
|
||||
)
|
||||
false
|
||||
)
|
||||
|
||||
fn randSort x y =
|
||||
(
|
||||
random -1 1
|
||||
)
|
||||
|
||||
fn shuffle arr =
|
||||
(
|
||||
qsort arr randSort
|
||||
arr
|
||||
)
|
||||
|
||||
fn bogosort arr =
|
||||
(
|
||||
while notSorted arr do
|
||||
(
|
||||
arr = shuffle arr
|
||||
)
|
||||
arr
|
||||
)
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
Bogosort[x_List] := Block[{t=x},While[!OrderedQ[t],t=RandomSample[x]]; t]
|
||||
|
||||
Bogosort[{1, 2, 6, 4, 0, -1, Pi, 3, 5}]
|
||||
=> {-1, 0, 1, 2, 3, Pi, 4, 5, 6}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
MODULE Bogo EXPORTS Main;
|
||||
|
||||
IMPORT IO, Fmt, Random;
|
||||
|
||||
VAR a := ARRAY [1..5] OF INTEGER {1, 2, 3, 4, 5};
|
||||
count := 0;
|
||||
|
||||
PROCEDURE Shuffle(VAR a: ARRAY OF INTEGER) =
|
||||
VAR temp: INTEGER;
|
||||
BEGIN
|
||||
WITH rand = NEW(Random.Default).init() DO
|
||||
FOR i := FIRST(a) TO LAST(a) - 1 DO
|
||||
WITH j = rand.integer(i, LAST(a)) DO
|
||||
temp := a[i];
|
||||
a[i] := a[j];
|
||||
a[j] := temp;
|
||||
END;
|
||||
END;
|
||||
END;
|
||||
END Shuffle;
|
||||
|
||||
PROCEDURE Sorted(VAR a: ARRAY OF INTEGER): BOOLEAN =
|
||||
BEGIN
|
||||
IF NUMBER(a) <= 1 THEN
|
||||
RETURN TRUE;
|
||||
END;
|
||||
FOR i := FIRST(a) + 1 TO LAST(a) DO
|
||||
IF (a[i] < a[i - 1]) THEN
|
||||
RETURN FALSE;
|
||||
END;
|
||||
END;
|
||||
RETURN TRUE;
|
||||
END Sorted;
|
||||
|
||||
BEGIN
|
||||
Shuffle(a);
|
||||
WHILE NOT Sorted(a) DO
|
||||
Shuffle(a);
|
||||
INC(count);
|
||||
END;
|
||||
FOR i := FIRST(a) TO LAST(a) DO
|
||||
IO.PutInt(a[i]);
|
||||
IO.Put(" ");
|
||||
END;
|
||||
IO.Put("\nRequired " & Fmt.Int(count) & " shuffles\n");
|
||||
END Bogo.
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
using System;
|
||||
using System.Console;
|
||||
using Nemerle.Imperative;
|
||||
|
||||
module Bogosort
|
||||
{
|
||||
public static Bogosort[T] (this x : array[T]) : void
|
||||
where T : IComparable
|
||||
{
|
||||
def rnd = Random();
|
||||
def shuffle(a)
|
||||
{
|
||||
foreach (i in [0 .. (a.Length - 2)])
|
||||
a[i] <-> a[(rnd.Next(i, a.Length))];
|
||||
}
|
||||
|
||||
def isSorted(b)
|
||||
{
|
||||
when (b.Length <= 1) return true;
|
||||
foreach (i in [1 .. (b.Length - 1)])
|
||||
when (b[i].CompareTo(b[i - 1]) < 0) return false;
|
||||
true;
|
||||
}
|
||||
|
||||
def loop()
|
||||
{
|
||||
unless (isSorted(x)) {shuffle(x); loop();};
|
||||
}
|
||||
|
||||
loop()
|
||||
}
|
||||
|
||||
Main() : void
|
||||
{
|
||||
def sortme = array[1, 5, 3, 6, 7, 3, 8, -2];
|
||||
sortme.Bogosort();
|
||||
foreach (i in sortme) Write($"$i ");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/* NetRexx */
|
||||
options replace format comments java crossref savelog symbols nobinary
|
||||
|
||||
import java.util.List
|
||||
|
||||
method isSorted(list = List) private static returns boolean
|
||||
|
||||
if list.isEmpty then
|
||||
return isTrue
|
||||
|
||||
it = list.iterator
|
||||
last = Comparable it.next
|
||||
loop label i_ while it.hasNext
|
||||
current = Comparable it.next
|
||||
if last.compareTo(current) > 0 then
|
||||
return isFalse
|
||||
last = current
|
||||
end i_
|
||||
|
||||
return isTrue
|
||||
|
||||
method bogoSort(list = List) private static
|
||||
loop label s_ while \isSorted(list)
|
||||
Collections.shuffle(list)
|
||||
end s_
|
||||
|
||||
return
|
||||
|
||||
method main(args = String[]) public constant
|
||||
samples = [int 31, 41, 59, 26, 53, 58, 97, 93, 23, 84]
|
||||
alst = ArrayList(samples.length)
|
||||
loop iv = 0 to samples.length - 1
|
||||
alst.add(Integer(samples[iv]))
|
||||
end iv
|
||||
|
||||
say 'unsorted:' alst.toString
|
||||
bogoSort(alst)
|
||||
say 'sorted: ' alst.toString
|
||||
|
||||
return
|
||||
|
||||
method isTrue public static returns boolean
|
||||
return 1 == 1
|
||||
|
||||
method isFalse public static returns boolean
|
||||
return \isTrue
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
let rec is_sorted comp = function
|
||||
| e1 :: e2 :: r -> comp e1 e2 <= 0 && is_sorted comp (e2 :: r)
|
||||
| _ -> true
|
||||
|
||||
(* Fisher-Yates shuffle on lists; uses temp array *)
|
||||
let shuffle l =
|
||||
let ar = Array.of_list l in
|
||||
for n = Array.length ar - 1 downto 1 do
|
||||
let k = Random.int (n+1) in
|
||||
let temp = ar.(k) in (* swap ar.(k) and ar.(n) *)
|
||||
ar.(k) <- ar.(n);
|
||||
ar.(n) <- temp
|
||||
done;
|
||||
Array.to_list ar
|
||||
|
||||
let rec bogosort li =
|
||||
if is_sorted compare li then
|
||||
li
|
||||
else
|
||||
bogosort (shuffle li)
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
MODULE Bogo;
|
||||
|
||||
IMPORT Out, Random;
|
||||
|
||||
VAR a: ARRAY 10 OF INTEGER;
|
||||
|
||||
PROCEDURE Init;
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
FOR i := 0 TO LEN(a) - 1 DO
|
||||
a[i] := i + 1;
|
||||
END;
|
||||
END Init;
|
||||
|
||||
PROCEDURE Sorted(VAR a: ARRAY OF INTEGER): BOOLEAN;
|
||||
VAR i: INTEGER;
|
||||
BEGIN
|
||||
IF LEN(a) <= 1 THEN
|
||||
RETURN TRUE;
|
||||
END;
|
||||
FOR i := 1 TO LEN(a) - 1 DO
|
||||
IF (a[i] < a[i - 1]) THEN
|
||||
RETURN FALSE;
|
||||
END;
|
||||
END;
|
||||
RETURN TRUE;
|
||||
END Sorted;
|
||||
|
||||
PROCEDURE Shuffle*(VAR a: ARRAY OF INTEGER);
|
||||
VAR n, t, r: INTEGER;
|
||||
BEGIN
|
||||
FOR n := 0 TO LEN(a) - 1 DO
|
||||
r := Random.Roll(n);
|
||||
t := a[n];
|
||||
a[n] := a[r];
|
||||
a[r] := t;
|
||||
END;
|
||||
END Shuffle;
|
||||
|
||||
BEGIN
|
||||
Init;
|
||||
Shuffle(a);
|
||||
WHILE ~Sorted(a) DO
|
||||
Shuffle(a);
|
||||
END;
|
||||
FOR i := 0 TO LEN(a) - 1 DO
|
||||
Out.Int(a[i], 0);
|
||||
Out.String(" ");
|
||||
END;
|
||||
Out.Ln;
|
||||
END Bogo.
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
declare
|
||||
proc {BogoSort Arr}
|
||||
for while:{Not {InOrder Arr}} do
|
||||
{Shuffle Arr}
|
||||
end
|
||||
end
|
||||
|
||||
fun {InOrder Arr}
|
||||
for I in {Array.low Arr}+1..{Array.high Arr}
|
||||
return:Return default:true
|
||||
do
|
||||
if Arr.(I-1) > Arr.I then {Return false} end
|
||||
end
|
||||
end
|
||||
|
||||
proc {Shuffle Arr}
|
||||
Low = {Array.low Arr}
|
||||
High = {Array.high Arr}
|
||||
in
|
||||
for I in High..Low;~1 do
|
||||
J = Low + {OS.rand} mod (I - Low + 1)
|
||||
OldI = Arr.I
|
||||
in
|
||||
Arr.I := Arr.J
|
||||
Arr.J := OldI
|
||||
end
|
||||
end
|
||||
|
||||
X = {Tuple.toArray unit(3 1 4 1 5 9 2 6 5)}
|
||||
in
|
||||
{BogoSort X}
|
||||
{Show {Array.toRecord unit X}}
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
bogosort(v)={
|
||||
while(1,
|
||||
my(u=vecextract(v,numtoperm(#v,random((#v)!))));
|
||||
for(i=2,#v,if(u[i]<u[i-1], next(2)));
|
||||
return(u)
|
||||
);
|
||||
};
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
function bogosort($l) {
|
||||
while (!in_order($l))
|
||||
shuffle($l);
|
||||
return $l;
|
||||
}
|
||||
|
||||
function in_order($l) {
|
||||
for ($i = 1; $i < count($l); $i++)
|
||||
if ($l[$i] < $l[$i-1])
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
program bogosort;
|
||||
|
||||
const
|
||||
max = 5;
|
||||
type
|
||||
list = array [1..max] of integer;
|
||||
|
||||
{ Print a list }
|
||||
procedure printa(a: list);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
for i := 1 to max do
|
||||
write(a[i], ' ');
|
||||
writeln
|
||||
end;
|
||||
|
||||
{ Knuth shuffle }
|
||||
procedure shuffle(var a: list);
|
||||
var
|
||||
i,k,tmp: integer;
|
||||
begin
|
||||
for i := max downto 2 do begin
|
||||
k := random(i) + 1;
|
||||
if (a[i] <> a[k]) then begin
|
||||
tmp := a[i]; a[i] := a[k]; a[k] := tmp
|
||||
end
|
||||
end
|
||||
end;
|
||||
|
||||
{ Check for sorted list }
|
||||
function sorted(a: list): boolean;
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
sorted := True;
|
||||
for i := 2 to max do
|
||||
if (a[i - 1] > a[i]) then begin
|
||||
sorted := False; exit
|
||||
end
|
||||
end;
|
||||
|
||||
{ Bogosort }
|
||||
procedure bogo(var a: list);
|
||||
var
|
||||
i: integer;
|
||||
begin
|
||||
i := 1; randomize;
|
||||
write(i,': '); printa(a);
|
||||
while not sorted(a) do begin
|
||||
shuffle(a);
|
||||
i := i + 1; write(i,': '); printa(a)
|
||||
end
|
||||
end;
|
||||
|
||||
{ Test and display }
|
||||
var
|
||||
a: list;
|
||||
i: integer;
|
||||
|
||||
begin
|
||||
for i := 1 to max do
|
||||
a[i] := (max + 1) - i;
|
||||
bogo(a);
|
||||
end.
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
sub bogosort (@list is copy) {
|
||||
@list .= pick(*) until [<=] @list;
|
||||
return @list;
|
||||
}
|
||||
|
||||
my @nums = (^5).map: { rand };
|
||||
say @nums.sort.Str eq @nums.&bogosort.Str ?? 'ok' !! 'not ok';
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
use List::Util qw(shuffle);
|
||||
|
||||
sub bogosort
|
||||
{my @l = @_;
|
||||
@l = shuffle(@l) until in_order(@l);
|
||||
return @l;}
|
||||
|
||||
sub in_order
|
||||
{my $last = shift;
|
||||
foreach (@_)
|
||||
{$_ >= $last or return 0;
|
||||
$last = $_;}
|
||||
return 1;}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
(de bogosort (Lst)
|
||||
(loop
|
||||
(map
|
||||
'((L) (rot L (rand 1 (length L))))
|
||||
Lst )
|
||||
(T (apply <= Lst) Lst) ) )
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
function shuffle ($a) {
|
||||
$c = $a.Clone() # make copy to avoid clobbering $a
|
||||
1..($c.Length - 1) | ForEach-Object {
|
||||
$i = Get-Random -Minimum $_ -Maximum $c.Length
|
||||
$c[$_-1],$c[$i] = $c[$i],$c[$_-1]
|
||||
$c[$_-1] # return newly-shuffled value
|
||||
}
|
||||
$c[-1] # last value
|
||||
}
|
||||
|
||||
function isSorted( [Array] $data )
|
||||
{
|
||||
$sorted = $true
|
||||
for( $i = 1; ( $i -lt $data.length ) -and $sorted; $i++ )
|
||||
{
|
||||
$sorted = $data[ $i - 1 ] -le $data[ $i ]
|
||||
}
|
||||
$sorted
|
||||
}
|
||||
|
||||
function BogoSort ( [Array] $indata ) {
|
||||
$data = $indata.Clone()
|
||||
while( -not ( isSorted $data ) ) {
|
||||
$data = shuffle $indata
|
||||
}
|
||||
$data
|
||||
}
|
||||
|
||||
$l = 7; BogoSort ( 1..$l | ForEach-Object { $Rand = New-Object Random }{ $Rand.Next( 0, $l - 1 ) } )
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
Procedure KnuthShuffle (Array a(1))
|
||||
Protected i, Size = ArraySize(a())
|
||||
For i = 0 To Size
|
||||
Swap a(i), a(Random(Size))
|
||||
Next
|
||||
EndProcedure
|
||||
|
||||
Procedure isSorted(Array a(1))
|
||||
Protected i, Size = ArraySize(a())
|
||||
For i = 1 To Size
|
||||
If a(i) < a(i - 1)
|
||||
ProcedureReturn #False
|
||||
EndIf
|
||||
Next
|
||||
ProcedureReturn #True
|
||||
EndProcedure
|
||||
|
||||
Procedure BogoSort(Array a(1))
|
||||
Protected Size = ArraySize(a()) + 1, iter
|
||||
|
||||
While Not isSorted(a())
|
||||
iter + 1
|
||||
KnuthShuffle(a())
|
||||
Wend
|
||||
MessageRequester("Results","Array of " + Str(Size) + " integers required " + Str(iter) + " shuffles To SORT.")
|
||||
EndProcedure
|
||||
|
||||
Dim b(10)
|
||||
For i = 0 To 10
|
||||
b(i) = Random(100)
|
||||
Next
|
||||
|
||||
BogoSort(b())
|
||||
|
|
@ -0,0 +1,16 @@
|
|||
import random
|
||||
|
||||
def bogosort(l):
|
||||
while not in_order(l):
|
||||
random.shuffle(l)
|
||||
return l
|
||||
|
||||
def in_order(l):
|
||||
if not l:
|
||||
return True
|
||||
last = l[0]
|
||||
for x in l[1:]:
|
||||
if x < last:
|
||||
return False
|
||||
last = x
|
||||
return True
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
def in_order(l):
|
||||
return all( l[i] <= l[i+1] for i in xrange(0,len(l)-1))
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
import random
|
||||
def bogosort(lst):
|
||||
random.shuffle(lst) # must shuffle it first or it's a bug if lst was pre-sorted! :)
|
||||
while lst != sorted(lst):
|
||||
random.shuffle(lst)
|
||||
return lst
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
(define remove-element
|
||||
0 [_ | R] -> R
|
||||
Pos [A | R] -> [A | (remove-element (1- Pos) R)])
|
||||
|
||||
(define get-element
|
||||
Pos R -> (nth (1+ Pos) R))
|
||||
|
||||
(define shuffle-0
|
||||
Pos R -> [(get-element Pos R) | (shuffle (remove-element Pos R))])
|
||||
|
||||
(define shuffle
|
||||
[] -> []
|
||||
R -> (shuffle-0 (RANDOM (length R)) R))
|
||||
|
||||
(define in-order?
|
||||
[] -> true
|
||||
[A] -> true
|
||||
[A B | R] -> (in-order? [B | R]) where (<= A B)
|
||||
_ -> false)
|
||||
|
||||
(define bogosort
|
||||
Suggestion -> Suggestion where (in-order? Suggestion)
|
||||
Suggestion -> (bogosort (shuffle Suggestion)))
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
bogosort <- function(x)
|
||||
{
|
||||
is.sorted <- function(x) all(diff(x) >= 0)
|
||||
while(!is.sorted(x)) x <- sample(x)
|
||||
x
|
||||
}
|
||||
|
||||
n <- c(1, 10, 9, 7, 3, 0)
|
||||
print(bogosort(n))
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
/*REXX program;to perform a type of bogo sort on an array. */
|
||||
/*a.1 is really the 0th Berstel number... */
|
||||
a.1 = 0 ; a.11= -64 ; a.21= 4096 ; a.31= 6291456
|
||||
a.2 = 0 ; a.12= 64 ; a.22= 40960 ; a.32= 5242880
|
||||
a.3 = 1 ; a.13= 256 ; a.23= 16384 ; a.33= -15728640
|
||||
a.4 = 2 ; a.14= 0 ; a.24= -114688 ; a.34= -27262976
|
||||
a.5 = 0 ; a.15= -768 ; a.25= -131072 ; a.35= 29360128
|
||||
a.6 = -4 ; a.16= -512 ; a.26= 262144 ; a.36= 104857600
|
||||
a.7 = 0 ; a.17= 2048 ; a.27= 589824 ; a.37= -16777216
|
||||
a.8 = 16 ; a.18= 3072 ; a.28= -393216 ; a.38= -335544320
|
||||
a.9 = 16 ; a.19= -4096 ; a.29= -2097152 ; a.39= -184549376
|
||||
a.10= -32 ; a.20= -12288 ; a.30= -262144 ; a.40= 905969664
|
||||
|
||||
size=40 /*we have a list of two score Berstel numbers.*/
|
||||
call tell 'un-bogoed'
|
||||
|
||||
do bogo=1
|
||||
|
||||
do j=1 for size
|
||||
_=a.j
|
||||
|
||||
do k=j+1 to size
|
||||
if a.k>=_ then iterate
|
||||
n=random(j,k) /*we have an num out of order.get rand*/
|
||||
do forever; m=random(j,k) /*get another random number.*/
|
||||
if m\==n then leave /*ensure we're not swapping the same #*/
|
||||
end /*forever*/
|
||||
parse value a.n a.m with a.m a.n /*swap 2 random nums*/
|
||||
iterate bogo
|
||||
end /*k*/
|
||||
end /*j*/
|
||||
|
||||
leave
|
||||
end /*bogo*/
|
||||
|
||||
say 'number of bogo sorts performed =' bogo-1
|
||||
call tell ' bogoed'
|
||||
exit /*stick a fork in it, we're done.*/
|
||||
/*──────────────────────────────────TELL subroutine─────────────────────*/
|
||||
tell: say; say center(arg(1),40,'─')
|
||||
|
||||
do j=1 to size
|
||||
say arg(1) 'element'right(j,length(size))'='right(a.j,20)
|
||||
end /*j*/
|
||||
say
|
||||
return
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#lang racket
|
||||
(define (bogo-sort l) (if (apply <= l) l (bogo-sort (shuffle l))))
|
||||
|
||||
(require rackunit)
|
||||
(check-equal? (bogo-sort '(6 5 4 3 2 1)) '(1 2 3 4 5 6))
|
||||
(check-equal? (bogo-sort (shuffle '(1 1 1 2 2 2))) '(1 1 1 2 2 2))
|
||||
|
||||
(let ((unsorted (for/list ((i 10)) (random 1000))))
|
||||
(displayln unsorted)
|
||||
(displayln (bogo-sort unsorted)))
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
def shuffle(l)
|
||||
l.sort_by { rand }
|
||||
end
|
||||
|
||||
def bogosort(l)
|
||||
l = shuffle(l) until in_order(l)
|
||||
l
|
||||
end
|
||||
|
||||
def in_order(l)
|
||||
(0..l.length-2).all? {|i| l[i] <= l[i+1] }
|
||||
end
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
def shuffle(l)
|
||||
l.sort_by { rand }
|
||||
end
|
||||
|
||||
def bogosort(l)
|
||||
l = shuffle(l) until l == l.sort
|
||||
l
|
||||
end
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
def in_order(l)
|
||||
(0..l.length-2).all? {|i| l[i] <= l[i+1] }
|
||||
end
|
||||
|
||||
def bogosort(l)
|
||||
l.shuffle! until in_order(l)
|
||||
l
|
||||
end
|
||||
|
|
@ -0,0 +1,41 @@
|
|||
* Library for random()
|
||||
-include 'Random.sno'
|
||||
|
||||
* # String -> array
|
||||
define('s2a(str,n)i') :(s2a_end)
|
||||
s2a s2a = array(n); str = str ' '
|
||||
sa1 str break(' ') . s2a<i = i + 1> span(' ') = :s(sa1)f(return)
|
||||
s2a_end
|
||||
|
||||
* # Array -> string
|
||||
define('a2s(a)i') :(a2s_end)
|
||||
a2s a2s = a2s a<i = i + 1> ' ' :s(a2s)f(return)
|
||||
a2s_end
|
||||
|
||||
* # Knuth shuffle in-place
|
||||
define('shuffle(a)alen,n,k,tmp') :(shuffle_end)
|
||||
shuffle n = alen = prototype(a);
|
||||
sh1 k = convert(random() * alen,'integer') + 1
|
||||
eq(a<n>,a<k>) :s(sh2)
|
||||
tmp = a<n>; a<n> = a<k>; a<k> = tmp
|
||||
sh2 n = gt(n,1) n - 1 :s(sh1)
|
||||
shuffle = a :(return)
|
||||
shuffle_end
|
||||
|
||||
* # sorted( ) predicate -> Succeed/Fail
|
||||
define('sorted(a)alen,i') :(sorted_end)
|
||||
sorted alen = prototype(a); i = 1
|
||||
std1 i = lt(i,alen) i + 1 :f(return)
|
||||
gt(a<i - 1>,a<i>) :s(freturn)f(std1)
|
||||
sorted_end
|
||||
|
||||
* # Bogosort
|
||||
define('bogo(a)') :(bogo_end)
|
||||
bogo output = (i = i + 1) ': ' a2s(a)
|
||||
bogo = sorted(a) a :s(return)
|
||||
shuffle(a) :(bogo)
|
||||
bogo_end
|
||||
|
||||
* # Test and display
|
||||
bogo(s2a('5 4 3 2 1',5))
|
||||
end
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
def isSorted(l: List[Int]) = l.iterator sliding 2 forall (s => s.head < s.last)
|
||||
def bogosort(l: List[Int]): List[Int] = if (isSorted(l)) l else bogosort(scala.util.Random.shuffle(l))
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
Smalltalk at: #isItSorted put: [ :c |
|
||||
|isit|
|
||||
isit := false.
|
||||
(2 to: (c size)) detect: [ :i |
|
||||
( (c at: ( i - 1 )) > (c at: i) )
|
||||
] ifNone: [ isit := true ].
|
||||
isit
|
||||
].
|
||||
Smalltalk at: #bogosort put: [ :c |
|
||||
[ isItSorted value: c ] whileFalse: [
|
||||
1 to: (c size) do: [ :i |
|
||||
|r t|
|
||||
r := (Random between: 1 and: (c size)).
|
||||
t := (c at: i).
|
||||
c at: i put: (c at: r).
|
||||
c at: r put: t
|
||||
]
|
||||
]
|
||||
].
|
||||
|
||||
|tobesorted|
|
||||
tobesorted := { 2 . 7 . 5 . 3 . 4 . 8 . 6 . 1 }.
|
||||
bogosort value: tobesorted.
|
||||
tobesorted displayNl.
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
package require Tcl 8.5
|
||||
|
||||
proc shuffleInPlace {listName} {
|
||||
upvar 1 $listName list
|
||||
set len [set len2 [llength $list]]
|
||||
for {set i 0} {$i < $len-1} {incr i; incr len2 -1} {
|
||||
# Pick cell to swap with
|
||||
set n [expr {int($i + $len2 * rand())}]
|
||||
# Perform swap
|
||||
set temp [lindex $list $i]
|
||||
lset list $i [lindex $list $n]
|
||||
lset list $n $temp
|
||||
}
|
||||
}
|
||||
proc inOrder {list} {
|
||||
set prev [lindex $list 0]
|
||||
foreach item [lrange $list 1 end] {
|
||||
if {$prev > $item} {
|
||||
return false
|
||||
}
|
||||
set prev $item
|
||||
}
|
||||
return true
|
||||
}
|
||||
proc bogosort {list} {
|
||||
while { ! [inOrder $list]} {
|
||||
shuffleInPlace list
|
||||
}
|
||||
return $list
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
#import std
|
||||
#import nat
|
||||
|
||||
shuffle = @iNX ~&l->r ^jrX/~&l ~&lK8PrC
|
||||
|
||||
bogosort = (not ordered nleq)-> shuffle
|
||||
|
||||
#cast %nL
|
||||
|
||||
example = bogosort <8,50,0,12,47,51>
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
sub swap( byref a, byref b )
|
||||
dim tmp
|
||||
tmp = a
|
||||
a = b
|
||||
b = tmp
|
||||
end sub
|
||||
|
||||
'knuth shuffle (I think)
|
||||
function shuffle( a )
|
||||
dim i
|
||||
dim r
|
||||
randomize timer
|
||||
for i = lbound( a ) to ubound( a )
|
||||
r = int( rnd * ( ubound( a ) + 1 ) )
|
||||
if r <> i then
|
||||
swap a(i), a(r)
|
||||
end if
|
||||
next
|
||||
shuffle = a
|
||||
end function
|
||||
|
||||
function inOrder( a )
|
||||
dim res
|
||||
dim i
|
||||
for i = 0 to ubound( a ) - 1
|
||||
res = ( a(i) <= a(i+1) )
|
||||
if res = false then exit for
|
||||
next
|
||||
inOrder = res
|
||||
end function
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
dim a
|
||||
a = array(11, 1, 2, 3, 4, 4, 6, 7, 8)
|
||||
|
||||
dim t
|
||||
t = timer
|
||||
while not inorder( a )
|
||||
shuffle a
|
||||
wend
|
||||
wscript.echo timer-t, "seconds"
|
||||
wscript.echo join( a, ", " )
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
code Ran=1, ChOut=8, IntOut=11;
|
||||
|
||||
proc BogoSort(A, L); \Sort array A of length L
|
||||
int A, L;
|
||||
int I, J, T;
|
||||
[loop [I:= 0;
|
||||
loop [if A(I) > A(I+1) then quit;
|
||||
I:= I+1;
|
||||
if I >= L-1 then return;
|
||||
];
|
||||
I:= Ran(L); J:= Ran(L);
|
||||
T:= A(I); A(I):= A(J); A(J):= T;
|
||||
];
|
||||
];
|
||||
|
||||
int A, I;
|
||||
[A:= [3, 1, 4, 1, -5, 9, 2, 6, 5, 4];
|
||||
BogoSort(A, 10);
|
||||
for I:= 0 to 10-1 do [IntOut(0, A(I)); ChOut(0, ^ )];
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue