Sorting algorithms/Stooge sort: Difference between revisions

added RPL
(added RPL)
 
(34 intermediate revisions by 21 users not shown)
Line 1:
{{task|Sorting Algorithms}}
{{sorting Algorithm}}
[[Category:Sorting]]
{{wikipedia|Stooge sort}}
{{omit from|GUISS}}
Line 20 ⟶ 21:
<b>return</b> L
<br><br>
 
=={{header|11l}}==
{{trans|Python}}
 
<syntaxhighlight lang="11l">F stoogesort(&l, i, j) -> Void
I l[j] < l[i]
swap(&l[i], &l[j])
I j - i > 1
V t = (j - i + 1) I/ 3
stoogesort(&l, i, j - t)
stoogesort(&l, i + t, j)
stoogesort(&l, i, j - t)
 
F stooge(&l)
R stoogesort(&l, 0, l.len - 1)
 
V data = [1, 4, 5, 3, -6, 3, 7, 10, -2, -5, 7, 5, 9, -3, 7]
stooge(&data)
print(data)</syntaxhighlight>
 
{{out}}
<pre>
[-6, -5, -3, -2, 1, 3, 3, 4, 5, 5, 7, 7, 7, 9, 10]
</pre>
 
=={{header|Action!}}==
Action! language does not support recursion. Therefore an iterative approach with a stack has been proposed.
<syntaxhighlight lang="action!">DEFINE MAX_COUNT="100"
INT ARRAY stack(MAX_COUNT)
INT stackSize
 
PROC PrintArray(INT ARRAY a INT size)
INT i
 
Put('[)
FOR i=0 TO size-1
DO
IF i>0 THEN Put(' ) FI
PrintI(a(i))
OD
Put(']) PutE()
RETURN
 
PROC InitStack()
stackSize=0
RETURN
 
BYTE FUNC IsEmpty()
IF stackSize=0 THEN
RETURN (1)
FI
RETURN (0)
 
PROC Push(INT low,high)
stack(stackSize)=low stackSize==+1
stack(stackSize)=high stackSize==+1
RETURN
 
PROC Pop(INT POINTER low,high)
stackSize==-1 high^=stack(stackSize)
stackSize==-1 low^=stack(stackSize)
RETURN
 
PROC StoogeSort(INT ARRAY a INT size)
INT l,h,t,tmp
 
InitStack()
Push(0,size-1)
WHILE IsEmpty()=0
DO
Pop(@l,@h)
IF a(l)>a(h) THEN
tmp=a(l) a(l)=a(h) a(h)=tmp
FI
IF h-l>1 THEN
t=(h-l+1)/3
Push(l,h-t)
Push(l+t,h)
Push(l,h-t)
FI
OD
RETURN
 
PROC Test(INT ARRAY a INT size)
PrintE("Array before sort:")
PrintArray(a,size)
StoogeSort(a,size)
PrintE("Array after sort:")
PrintArray(a,size)
PutE()
RETURN
 
PROC Main()
INT ARRAY
a(10)=[1 4 65535 0 3 7 4 8 20 65530],
b(21)=[10 9 8 7 6 5 4 3 2 1 0
65535 65534 65533 65532 65531
65530 65529 65528 65527 65526],
c(8)=[101 102 103 104 105 106 107 108],
d(12)=[1 65535 1 65535 1 65535 1
65535 1 65535 1 65535]
Test(a,10)
Test(b,21)
Test(c,8)
Test(d,12)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Stooge_sort.png Screenshot from Atari 8-bit computer]
<pre>
Array before sort:
[1 4 -1 0 3 7 4 8 20 -6]
Array after sort:
[-6 -1 0 1 3 4 4 7 8 20]
 
Array before sort:
[10 9 8 7 6 5 4 3 2 1 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10]
Array after sort:
[-10 -9 -8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7 8 9 10]
 
Array before sort:
[101 102 103 104 105 106 107 108]
Array after sort:
[101 102 103 104 105 106 107 108]
 
Array before sort:
[1 -1 1 -1 1 -1 1 -1 1 -1 1 -1]
Array after sort:
[-1 -1 -1 -1 -1 -1 1 1 1 1 1 1]
</pre>
 
=={{header|Ada}}==
Line 25 ⟶ 156:
Using slices and 'First / 'Last removes the need for I / J parameters.
 
<langsyntaxhighlight Adalang="ada">with Ada.Text_IO;
procedure Stooge is
type Integer_Array is array (Positive range <>) of Integer;
Line 56 ⟶ 187:
end loop;
Ada.Text_IO.New_Line;
end Stooge;</langsyntaxhighlight>
 
{{out}}
Line 63 ⟶ 194:
=={{header|ALGOL 68}}==
{{works with|ALGOL 68G|Any - tested with release 2.8.win32}}
<langsyntaxhighlight lang="algol68"># swaps the values of the two REF INTs #
PRIO =:= = 1;
OP =:= = ( REF INT a, b )VOID: ( INT t := a; a := b; b := t );
Line 89 ⟶ 220:
# test the stooge sort #
[]INT data = ( 67, -201, 0, 9, 9, 231, 4 );
print( ( "before: ", data, newline, "after: ", stooge sort( data ), newline ) )</langsyntaxhighlight>
{{out}}
<pre>
Line 95 ⟶ 226:
after: -201 +0 +4 +9 +9 +67 +231
</pre>
 
=={{header|Arturo}}==
<syntaxhighlight lang="arturo">innerStoogeSort: function [a, i, j][
if a\[j] < a\[i] [
t: a\[i]
a\[i]: a\[j]
a\[j]: t
]
if 1 < j - i [
t: (1 + j - i) / 3
innerStoogeSort a i j-t
innerStoogeSort a i+t j
innerStoogeSort a i j-t
]
]
 
stoogeSort: function [arr][
result: new arr
innerStoogeSort result 0 dec size result
return result
]
 
print stoogeSort [3 1 2 8 5 7 9 4 6]</syntaxhighlight>
 
{{out}}
 
<pre>1 2 3 4 5 6 7 8 9</pre>
 
=={{header|AutoHotkey}}==
<langsyntaxhighlight AutoHotkeylang="autohotkey">StoogeSort(L, i:=1, j:=""){
if !j
j := L.MaxIndex()
Line 112 ⟶ 270:
}
return L
}</langsyntaxhighlight>
Examples:<langsyntaxhighlight AutoHotkeylang="autohotkey">MsgBox % map(StoogeSort([123,51,6,73,3,-12,0]))
return
 
Line 120 ⟶ 278:
res .= v ","
return trim(res, ",")
}</langsyntaxhighlight>
Outputs:<pre>-12,0,3,6,51,73,123</pre>
 
=={{header|BASIC}}==
==={{header|BBC BASIC}}===
<syntaxhighlight lang="bbcbasic"> DIM test%(9)
test%() = 4, 65, 2, -31, 0, 99, 2, 83, 782, 1
PROCstoogesort(test%(), 0, DIM(test%(),1))
FOR i% = 0 TO 9
PRINT test%(i%) ;
NEXT
PRINT
END
DEF PROCstoogesort(l%(), i%, j%)
LOCAL t%
IF l%(j%) < l%(i%) SWAP l%(i%), l%(j%)
IF j% - i% > 1 THEN
t% = (j% - i% + 1)/3
PROCstoogesort(l%(), i%, j%-t%)
PROCstoogesort(l%(), i%+t%, j%)
PROCstoogesort(l%(), i%, j%-t%)
ENDIF
ENDPROC</syntaxhighlight>
{{out}}
<pre>
-31 0 1 2 2 4 65 83 99 782
</pre>
 
==={{header|QuickBASIC}}===
{{works with|QuickBASIC|7.1}}
 
Line 129 ⟶ 313:
It ''definitely'' does '''not''' work with QBasic.
 
<langsyntaxhighlight lang="qbasic">DECLARE SUB stoogesort (L() AS LONG, i AS LONG, j AS LONG)
 
RANDOMIZE TIMER
Line 152 ⟶ 336:
NEXT
PRINT
 
 
SUB stoogesort (L() AS LONG, i AS LONG, j AS LONG)
Line 162 ⟶ 347:
stoogesort L(), i, j - t
END IF
END SUB</langsyntaxhighlight>
 
{{out}}
<pre>
Before: 15 42 21 50 33 65 40 43 20 25 19
After: 15 19 20 21 33 25 40 42 43 50 65
</pre>
<pre>
Before: 99 21 84 55 32 26 86 27 8 45 11
After: 8 11 21 26 27 32 45 55 84 86 99
</pre>
<pre>
Before: 11 50 11 37 97 94 92 70 92 57 88
After: 11 11 37 50 57 70 88 92 92 94 97
</pre>
 
=={{header|BBC BASICBCPL}}==
<syntaxhighlight lang="bcpl">get "libhdr"
<lang bbcbasic> DIM test%(9)
 
test%() = 4, 65, 2, -31, 0, 99, 2, 83, 782, 1
let stoogesort(L, i, j) be
PROCstoogesort(test%(), 0, DIM(test%(),1))
$( if L!j < FOR L!i% = 0 TO 9then
$( let x PRINT= test%(L!i%) ;
NEXT L!i := L!j
PRINT L!j := x
END$)
if j-i>1 then
$( DEFlet t = PROCstoogesort(l%(),j - i%, j%+ 1)/3
LOCAL stoogesort(L, i, j-t%)
IF l%(j%) < l%stoogesort(i%)L, SWAP l%(i%)+t, l%(j%)
IF j% -stoogesort(L, i%, > 1 THENj-t)
$)
t% = (j% - i% + 1)/3
$)
PROCstoogesort(l%(), i%, j%-t%)
 
PROCstoogesort(l%(), i%+t%, j%)
let write(s, A, len) be
PROCstoogesort(l%(), i%, j%-t%)
$( writes(s)
ENDIF
for i=0 to len-1 do writed(A!i, 4)
ENDPROC</lang>
wrch('*N')
$)
let start() be
$( let array = table 4,65,2,-31,0,99,2,83,782,1
let length = 10
write("Before: ", array, length)
stoogesort(array, 0, length-1)
write("After: ", array, length)
$)</syntaxhighlight>
{{out}}
<pre>Before: 4 65 2 -31 0 99 2 83 782 1
<pre>
After: -31 0 1 2 2 4 65 83 99 782</pre>
</pre>
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdio.h>
 
#define SWAP(r,s) do{ t=r; r=s; s=t; } while(0)
Line 228 ⟶ 427:
return 0;
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
<syntaxhighlight lang="c sharp|c#"> public static void Sort<T>(List<T> list) where T : IComparable {
if (list.Count > 1) {
StoogeSort(list, 0, list.Count - 1);
}
}
private static void StoogeSort<T>(List<T> L, int i, int j) where T : IComparable {
if (L[j].CompareTo(L[i])<0) {
T tmp = L[i];
L[i] = L[j];
L[j] = tmp;
}
if (j - i > 1) {
int t = (j - i + 1) / 3;
StoogeSort(L, i, j - t);
StoogeSort(L, i + t, j);
StoogeSort(L, i, j - t);
}
}</syntaxhighlight>
 
=={{header|C++}}==
<syntaxhighlight lang="cpp">
<lang Cpp>
#include <iostream>
#include <time.h>
Line 262 ⟶ 481:
return system( "pause" );
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 277 ⟶ 496:
15 16 18 19
</pre>
 
=={{header|C sharp|C#}}==
<lang C sharp|C#> public static void Sort<T>(List<T> list) where T : IComparable {
if (list.Count > 1) {
StoogeSort(list, 0, list.Count - 1);
}
}
private static void StoogeSort<T>(List<T> L, int i, int j) where T : IComparable {
if (L[j].CompareTo(L[i])<0) {
T tmp = L[i];
L[i] = L[j];
L[j] = tmp;
}
if (j - i > 1) {
int t = (j - i + 1) / 3;
StoogeSort(L, i, j - t);
StoogeSort(L, i + t, j);
StoogeSort(L, i, j - t);
}
}</lang>
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">(defn swap [v x y]
(assoc! v y (v x) x (v y)))
 
Line 311 ⟶ 510:
(stooge-sort v (+ i t) j)
(stooge-sort v i (- j t))))
v))</langsyntaxhighlight>
 
=={{header|COBOL}}==
{{works with|GNU Cobol}}
<langsyntaxhighlight lang="cobol"> >>SOURCE FREE
IDENTIFICATION DIVISION.
PROGRAM-ID. stooge-sort-test.
Line 394 ⟶ 593:
END-IF
.
END PROGRAM stooge-sort.</langsyntaxhighlight>
 
{{out}}
Line 403 ⟶ 602:
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun stooge-sort (vector &optional (i 0) (j (1- (length vector))))
(when (> (aref vector i) (aref vector j))
(rotatef (aref vector i) (aref vector j)))
Line 411 ⟶ 610:
(stooge-sort vector (+ i third) j)
(stooge-sort vector i (- j third))))
vector)</langsyntaxhighlight>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.algorithm, std.array;
 
void stoogeSort(T)(T[] seq) pure nothrow {
Line 432 ⟶ 631:
data.stoogeSort();
writeln(data);
}</langsyntaxhighlight>
{{out}}
[-6, -5, -2, 1, 3, 3, 4, 5, 7, 10]
 
=={{header|Delphi}}==
{{works with|Delphi|6.0}}
{{libheader|SysUtils,StdCtrls}}
 
 
<syntaxhighlight lang="Delphi">
 
 
procedure StoogeSort(var L: array of integer; I,J: integer);
var T,M: integer;
begin
if L[j] < L[i] then
begin
M:=L[I];
L[I]:=L[J];
L[J]:=M;
end;
if (J - I) > 1 then
begin
T:=(J - I + 1) div 3;
StoogeSort(L, I, J-T);
StoogeSort(L, I+T, J);
StoogeSort(L, I, J-T);
end;
end;
 
 
procedure DoStoogeSort(var L: array of integer);
begin
StoogeSort(L,0,High(L));
end;
 
 
var TestData: array [0..9] of integer = (17, 23, 21, 56, 14, 10, 5, 2, 30, 25);
 
 
function GetArrayStr(IA: array of integer): string;
var I: integer;
begin
Result:='[';
for I:=0 to High(IA) do
begin
if I>0 then Result:=Result+' ';
Result:=Result+Format('%3d',[IA[I]]);
end;
Result:=Result+']';
end;
 
procedure ShowStoogeSort(Memo: TMemo);
begin
Memo.Lines.Add('Raw Data: '+GetArrayStr(TestData));
DoStoogeSort(TestData);
Memo.Lines.Add('Sorted Data: '+GetArrayStr(TestData));
end;
 
 
</syntaxhighlight>
{{out}}
<pre>
Raw Data: [ 17 23 21 56 14 10 5 2 30 25]
Sorted Data: [ 2 5 10 14 17 21 23 25 30 56]
Elapsed Time: 1.158 ms.
 
</pre>
 
 
=={{header|EasyLang}}==
<syntaxhighlight>
proc stsort left right . d[] .
if d[left] > d[right]
swap d[left] d[right]
.
if right - left + 1 > 2
t = (right - left + 1) div 3
stsort left right - t d[]
stsort left + t right d[]
stsort left right - t d[]
.
.
for i = 1 to 100
d[] &= randint 1000
.
stsort 1 len d[] d[]
print d[]
</syntaxhighlight>
 
=={{header|Eiffel}}==
<syntaxhighlight lang="eiffel">
<lang Eiffel>
class
STOOGE_SORT
Line 467 ⟶ 752:
end
end
</syntaxhighlight>
</lang>
Test:
<syntaxhighlight lang="eiffel">
<lang Eiffel>
class
APPLICATION
Line 502 ⟶ 787:
 
end
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 510 ⟶ 795:
-2 0 2 5 7 66
</pre>
 
=={{header|Elena}}==
ELENA 36.4x :
<langsyntaxhighlight lang="elena">import extensions.;
import system'routines.;
extension op
{
stoogeSort()
= self .stoogeSort(0, self length.Length - 1).;
stoogeSort(IntNumber i, IntNumber j)
[{
if(self[j]<self[i])
[{
self .exchange(i,j)
].};
if (j - i > 1)
[{
int t := (j - i + 1) / 3.;
self .stoogeSort(i,j-t).;
self .stoogeSort(i+t,j).;
self .stoogeSort(i,j-t).
]}
]}
}
public program()
{
[
var list := new Range(0, to:15 repeat(:n).selectBy::(randomGeneratorn eval=> randomGenerator.nextInt(20)); toArray.toArray();
console .printLine("before:", list).asEnumerable());
console .printLine("after:", list .stoogeSort().asEnumerable())
}</syntaxhighlight>
]</lang>
{{out}}
<pre>
Line 550 ⟶ 836:
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule Sort do
def stooge_sort(list) do
stooge_sort(List.to_tuple(list), 0, length(list)-1) |> Tuple.to_list
Line 572 ⟶ 858:
 
(for _ <- 1..20, do: :rand.uniform(20)) |> IO.inspect
|> Sort.stooge_sort |> IO.inspect</langsyntaxhighlight>
 
{{out}}
Line 581 ⟶ 867:
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">function stooge(sequence s, integer i, integer j)
object temp
integer t
Line 605 ⟶ 891:
 
? s
? stoogesort(s)</langsyntaxhighlight>
 
{{out}}
<pre>{875,616,725,922,463,740,949,476,697,455}
{455,463,476,616,697,725,740,875,922,949}
</pre>
 
=={{header|Factor}}==
<syntaxhighlight lang="factor">USING: kernel locals math prettyprint sequences ;
IN: rosetta-code.stooge-sort
 
<PRIVATE
 
:: (stooge-sort) ( seq i j -- )
j i [ seq nth ] bi@ < [
j i seq exchange
] when
j i - 1 > [
j i - 1 + 3 /i :> t
seq i j t - (stooge-sort)
seq i t + j (stooge-sort)
seq i j t - (stooge-sort)
] when ;
 
PRIVATE>
 
: stooge-sort ( seq -- sortedseq )
[ clone dup ] [ drop 0 ] [ length 1 - ] tri (stooge-sort) ;
 
: stooge-sort-demo ( -- )
{ 1 4 5 3 -6 3 7 10 -2 -5 } stooge-sort . ;
 
MAIN: stooge-sort-demo</syntaxhighlight>
{{out}}
<pre>
{ -6 -5 -2 1 3 3 4 5 7 10 }
</pre>
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
<langsyntaxhighlight lang="fortran">program Stooge
implicit none
 
Line 644 ⟶ 961:
 
end subroutine
end program</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' version 23-10-2016
' compile with: fbc -s console
 
Line 686 ⟶ 1,004:
Print : Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
{{out}}
<pre>Unsorted
Line 695 ⟶ 1,013:
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 719 ⟶ 1,037:
stoogesort(a[:len(a)-t])
}
}</langsyntaxhighlight>
 
=={{header|Haskell}}==
 
<langsyntaxhighlight lang="haskell">import Data.List
import Control.Arrow
import Control.Monad
Line 742 ⟶ 1,060:
xs'
| xs!!j < xs!!i = swapElems xs i j
| otherwise = xs</langsyntaxhighlight>
Example:
<langsyntaxhighlight lang="haskell">*Main> stoogeSort [1, 4, 5, 3, -6, 3, 7, 10, -2, -5, 7, 5, 9, -3, 7]
[-6,-5,-3,-2,1,3,3,4,5,5,7,7,7,9,10]</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">procedure main() #: demonstrate various ways to sort a list and string
demosort(stoogesort,[3, 14, 1, 5, 9, 2, 6, 3],"qwerty")
end
Line 769 ⟶ 1,087:
}
return X # X must be returned and assigned to sort a string
end</langsyntaxhighlight>
 
Note: This example relies on [[Sorting_algorithms/Bubble_sort#Icon| the supporting procedures 'sortop', and 'demosort' in Bubble Sort]].
Line 782 ⟶ 1,100:
on string : "qwerty"
with op = &null: "eqrtwy" (0 ms)</pre>
 
=={{header|IS-BASIC}}==
<syntaxhighlight lang="is-basic">100 PROGRAM "StoogSrt.bas"
110 RANDOMIZE
120 NUMERIC ARRAY(5 TO 16)
130 CALL INIT(ARRAY)
140 CALL WRITE(ARRAY)
150 CALL STOOGESORT(ARRAY,LBOUND(ARRAY),UBOUND(ARRAY))
160 CALL WRITE(ARRAY)
170 DEF INIT(REF A)
180 FOR I=LBOUND(A) TO UBOUND(A)
190 LET A(I)=RND(99)+1
200 NEXT
210 END DEF
220 DEF WRITE(REF A)
230 FOR I=LBOUND(A) TO UBOUND(A)
240 PRINT A(I);
250 NEXT
260 PRINT
270 END DEF
280 DEF STOOGESORT(REF A,I,J)
290 NUMERIC T
300 IF A(J)<A(I) THEN LET T=A(J):LET A(J)=A(I):LET A(I)=T
310 IF J-I>1 THEN
320 LET T=IP((J-I+1)/3)
330 CALL STOOGESORT(A,I,J-T)
340 CALL STOOGESORT(A,I+T,J)
350 CALL STOOGESORT(A,I,J-T)
360 END IF
370 END DEF</syntaxhighlight>
 
=={{header|J}}==
<langsyntaxhighlight lang="j">swapElems=: |.@:{`[`]}
 
stoogeSort=: 3 : 0
Line 794 ⟶ 1,142:
(x-0,t) stoogeSort (x+t,0) stoogeSort (x-0,t) stoogeSort y
else. y end.
)</langsyntaxhighlight>
Example:
<langsyntaxhighlight lang="j"> (,: stoogeSort) ?~13
3 10 8 4 7 12 1 2 11 6 5 9 0
0 1 2 3 4 5 6 7 8 9 10 11 12
</syntaxhighlight>
</lang>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java">import java.util.Arrays;
 
public class Stooge {
Line 828 ⟶ 1,176:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>[-6, -5, -2, 1, 3, 3, 4, 5, 7, 10]</pre>
 
=={{header|JavaScript}}==
<langsyntaxhighlight lang="javascript">function stoogeSort (array, i, j) {
if (j === undefined) {
j = array.length - 1;
Line 854 ⟶ 1,202:
stoogeSort(array, i, j-t);
}
};</langsyntaxhighlight>
Example:
<langsyntaxhighlight lang="javascript">arr = [9,1,3,10,13,4,2];
stoogeSort(arr);
console.log(arr);</langsyntaxhighlight>
{{out}}
<pre>[1, 2, 3, 4, 9, 10, 13]</pre>
 
=={{header|jq}}==
{{works with|jq|1.4}}
<langsyntaxhighlight lang="jq">def stoogesort:
def swap(i;j): .[i] as $t | .[i] = .[j] | .[j] = $t;
Line 879 ⟶ 1,228:
end;
 
[., 0, length-1] | ss;</langsyntaxhighlight>
'''Example'''
<langsyntaxhighlight lang="jq">([],
[1],
[1,2],
[1,3,2,4],
[1,4,5,3,-6,3,7,10,-2,-5]
) | stoogesort</langsyntaxhighlight>
{{out}}
<langsyntaxhighlight lang="sh">$ jq -c -n -f stooge_sort.jq
[]
[1]
[1,2]
[1,2,3,4]
[-6,-5,-2,1,3,3,4,5,7,10]</langsyntaxhighlight>
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
{{trans|Matlab}}
<langsyntaxhighlight lang="julia">function stoogesort!(a::Array, i::Int=1, j::Int=length(a))
if a[j] < a[i]
a[[i, j]] = a[[j, i]];
Line 914 ⟶ 1,263:
 
x = randn(10)
@show x stoogesort!(x)</langsyntaxhighlight>
 
{{out}}
Line 921 ⟶ 1,270:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.0
 
fun stoogeSort(a: IntArray, i: Int, j: Int) {
Line 942 ⟶ 1,291:
stoogeSort(a, 0, a.size - 1)
println("Sorted : ${a.asList()}")
}</langsyntaxhighlight>
 
{{out}}
Line 949 ⟶ 1,298:
Sorted : [-199, -52, 2, 3, 33, 56, 99, 100, 177, 200]
</pre>
 
=={{header|Lambdatalk}}==
<syntaxhighlight lang="scheme">
{def stoogesort
{def stoogesort.r
{lambda {:a :i :j}
{let { {:a {if {< {A.get :j :a} {A.get :i :a}}
then {A.swap! :i :j :a}
else :a}}
{:i :i} {:j :j}
{:t {floor {/ {+ :j {- :i} 1} 3}}}
} {if {> {- :j :i} 1}
then {stoogesort.r :a :i {- :j :t}}
{stoogesort.r :a {+ :i :t} :j}
{stoogesort.r :a :i {- :j :t}}
else }} }}
{lambda {:a}
{stoogesort.r :a 0 {- {A.length :a} 1}} :a}}
-> stoogesort
 
{def A {A.new 9 1 3 10 13 4 2}}
-> A
 
{stoogesort {A}}
-> [1,2,3,4,9,10,13]
</syntaxhighlight>
 
=={{header|Lua}}==
Line 955 ⟶ 1,330:
and made generic with an optional predicate parameter.
 
<langsyntaxhighlight lang="lua">
local Y = function (f)
return (function(x) return x(x) end)(function(x) return f(function(...) return x(x)(...) end) end)
Line 983 ⟶ 1,358:
print(unpack(stoogesort{9,7,8,5,6,3,4,2,1,0}))
 
</syntaxhighlight>
</lang>
 
=={{header|MathematicaMaple}}==
<syntaxhighlight lang="maple">swap := proc(arr, a, b)
<lang Mathematica>stoogeSort[lst_, I_, J_] := Module[{i = I, j = J, list = lst},
local temp := arr[a];
arr[a] := arr[b];
arr[b] := temp;
end proc:
 
stoogesort:= proc(arr, start_index, end_index)
If[list[[j]] < list[[i]], list[[{i,j}]] = list[[{j,i}]];]
local cur;
if (arr[end_index] < arr[start_index]) then
swap(arr, start_index, end_index);
end if;
if end_index - start_index > 1 then
cur := trunc((end_index - start_index + 1)/3);
stoogesort(arr, start_index, end_index - cur);
stoogesort(arr, start_index + cur, end_index);
stoogesort(arr, start_index, end_index - cur);
end if;
return arr;
end proc:
 
 
arr := Array([4, 2, 6, 1, 3, 7, 9, 5, 8]):
stoogesort(arr, 1, numelems(arr));</syntaxhighlight>
{{out}}
<pre>
[1, 2, 3, 4, 5, 6, 7, 8, 9]
</pre>
 
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">stoogeSort[lst_, I_, J_] := Module[{i = I, j = J, list = lst},
If[list[[j]] < list[[i]], list[[{i,j}]] = list[[{j,i}]];]
If[(j-i) > 1, t = Round[(j-i+1)/3];
list=stoogeSort[list,i,j-t];
list=stoogeSort[list,i+t,j];
list=stoogeSort[list,i,j-t];];
 
list
]</langsyntaxhighlight>
{{out}}
 
<pre>stoogeSort[{3,2,9,6,8},1,5]
{2,3,6,8,9}</pre>
 
=={{header|MATLAB}} / {{header|Octave}}==
<langsyntaxhighlight MATLABlang="matlab">%Required inputs:
%i = 1
%j = length(list)
Line 1,019 ⟶ 1,423:
end
 
end</langsyntaxhighlight>
{{out}}
<langsyntaxhighlight MATLABlang="matlab">>> stoogeSort([1 -6 4 -9],1,4)
 
ans =
 
-9 -6 1 4</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<langsyntaxhighlight MAXScriptlang="maxscript">fn stoogeSort arr i: j: =
(
if i == unsupplied do i = 1
Line 1,045 ⟶ 1,449:
)
return arr
)</langsyntaxhighlight>
{{out}}
<langsyntaxhighlight MAXScriptlang="maxscript">a = for i in 1 to 15 collect random 1 20
#(10, 2, 1, 19, 18, 20, 18, 5, 13, 2, 13, 9, 7, 10, 6)
stoogeSort a
#(1, 2, 2, 5, 6, 7, 9, 10, 10, 13, 13, 18, 18, 19, 20)
</syntaxhighlight>
</lang>
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref savelog symbols binary
 
Line 1,089 ⟶ 1,493:
 
return L_
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,097 ⟶ 1,501:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">proc stoogeSort[T](a: var openarray[T], i, j: int) =
if a[j] < a[i]: swap a[i], a[j]
if j - i > 1:
Line 1,107 ⟶ 1,511:
var a = @[4, 65, 2, -31, 0, 99, 2, 83, 782]
stoogeSort a, 0, a.high
echo a</langsyntaxhighlight>
{{out}}
<pre>@[-31, 0, 2, 2, 4, 65, 83, 99, 782]</pre>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">
bundle Default {
class Stooge {
Line 1,144 ⟶ 1,548:
}
}
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
 
<langsyntaxhighlight lang="ocaml">let swap ar i j =
let tmp = ar.(i) in
ar.(i) <- ar.(j);
Line 1,164 ⟶ 1,568:
end
in
aux 0 (Array.length ar - 1)</langsyntaxhighlight>
 
testing:
<langsyntaxhighlight lang="ocaml">let () =
let ar = [| 3; 1; 7; 2; 6; 5; 4; 9; 8 |] in
stoogesort ar;
Array.iter (Printf.printf " %d") ar;
print_newline()</langsyntaxhighlight>
 
=={{header|ooRexx}}==
{{Trans|NetRexx}}
<langsyntaxhighlight ooRexxlang="oorexx">/* Rexx */
 
call demo
Line 1,255 ⟶ 1,659:
self~put(item, ix)
return
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,281 ⟶ 1,685:
 
=={{header|Oz}}==
<langsyntaxhighlight lang="oz">declare
proc {StoogeSort Arr}
proc {Swap I J}
Line 1,320 ⟶ 1,724:
for I in {Array.low Arr}..{Array.high Arr} do
{System.printInfo Arr.I#", "}
end</langsyntaxhighlight>
 
{{out}}
Line 1,327 ⟶ 1,731:
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">stoogeSort(v)={
local(v=v); \\ Give children access to v
ss(1,#v); \\ Sort
Line 1,346 ⟶ 1,750:
ss(i,j-t)
)
};</langsyntaxhighlight>
 
=={{header|Pascal}}==
<langsyntaxhighlight lang="pascal">program StoogeSortDemo;
type
Line 1,394 ⟶ 1,798:
end;
writeln;
end.</langsyntaxhighlight>
{{out}}
<pre>./StoogeSort
Line 1,404 ⟶ 1,808:
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">sub stooge {
use integer;
my ($x, $i, $j) = @_;
Line 1,427 ⟶ 1,831:
stooge(\@a);
print "After @a\n";
</syntaxhighlight>
</lang>
 
=={{header|Perl 6}}==
<lang perl6>sub stoogesort( @L, $i = 0, $j = @L.end ) {
@L[$j,$i] = @L[$i,$j] if @L[$i] > @L[$j];
 
my $interval = $j - $i;
if $interval > 1 {
my $t = ( $interval + 1 ) div 3;
stoogesort( @L, $i , $j-$t );
stoogesort( @L, $i+$t, $j );
stoogesort( @L, $i , $j-$t );
}
return @L;
}
 
my @L = 1, 4, 5, 3, -6, 3, 7, 10, -2, -5;
 
stoogesort(@L).Str.say;
</lang>
 
=={{header|Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
Copy of [[Sorting_algorithms/Stooge_sort#Euphoria|Euphoria]]
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<lang Phix>function stoogesort(sequence s, integer i=1, integer j=length(s))
integer t
<span style="color: #008080;">function</span> <span style="color: #000000;">stoogesort</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">integer</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">))</span>
if s[j]<s[i] then
<span style="color: #008080;">if</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]<</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span> <span style="color: #008080;">then</span>
{s[i],s[j]} = {s[j],s[i]}
<span style="color: #0000FF;">{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">],</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">]}</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">j</span><span style="color: #0000FF;">],</span><span style="color: #000000;">s</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]}</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if j-i>1 then
<span style="color: #008080;">if</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">-</span><span style="color: #000000;">i</span><span style="color: #0000FF;">></span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span>
t = floor((j-i+1)/3)
<span style="color: #004080;">integer</span> <span style="color: #000000;">t</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">floor</span><span style="color: #0000FF;">((</span><span style="color: #000000;">j</span><span style="color: #0000FF;">-</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span><span style="color: #0000FF;">)/</span><span style="color: #000000;">3</span><span style="color: #0000FF;">)</span>
s = stoogesort(s,i, j-t)
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">stoogesort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">-</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
s = stoogesort(s,i+t,j )
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">stoogesort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">+</span><span style="color: #000000;">t</span><span style="color: #0000FF;">,</span><span style="color: #000000;">j</span> <span style="color: #0000FF;">)</span>
s = stoogesort(s,i, j-t)
<span style="color: #000000;">s</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">stoogesort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">-</span><span style="color: #000000;">t</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
return s
<span style="color: #008080;">return</span> <span style="color: #000000;">s</span>
end function</lang>
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<span style="color: #0000FF;">?</span><span style="color: #000000;">stoogesort</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">shuffle</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">tagset</span><span style="color: #0000FF;">(</span><span style="color: #000000;">10</span><span style="color: #0000FF;">)))</span>
<!--</syntaxhighlight>-->
{{out}}
<pre>
{1,2,3,4,5,6,7,8,9,10}
</pre>
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php">
function stoogeSort(&$arr, $i, $j)
{
Line 1,481 ⟶ 1,873:
}
}
</syntaxhighlight>
</lang>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de stoogeSort (L N)
(default N (length L))
(let P (nth L N)
Line 1,494 ⟶ 1,886:
(stoogeSort (nth L (inc D)) (- N D))
(stoogeSort L (- N D)) ) )
L )</langsyntaxhighlight>
Test:
<pre>: (apply < (stoogeSort (make (do 100 (link (rand))))))
Line 1,500 ⟶ 1,892:
 
=={{header|PL/I}}==
<langsyntaxhighlight lang="pli">stoogesort: procedure (L) recursive; /* 16 August 2010 */
declare L(*) fixed binary;
declare (i, j, t, temp) fixed binary;
Line 1,516 ⟶ 1,908:
end;
end;
end stoogesort;</langsyntaxhighlight>
 
=={{header|PowerBASIC}}==
Line 1,530 ⟶ 1,922:
This version is closely based on the BASIC code above.
 
<langsyntaxhighlight lang="powerbasic">%arraysize = 10
 
SUB stoogesort (L() AS LONG, i AS LONG, j AS LONG)
Line 1,570 ⟶ 1,962:
 
? s
END FUNCTION</langsyntaxhighlight>
 
{{out}}
Line 1,581 ⟶ 1,973:
 
=={{header|PowerShell}}==
<langsyntaxhighlight PowerShelllang="powershell">Function StoogeSort( [Int32[]] $L )
{
$i = 0
Line 1,602 ⟶ 1,994:
}
 
StoogeSort 9, 7, 5, 3, 1, 2, 4, 6, 8</langsyntaxhighlight>
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Procedure Stooge_Sort(Array L.i(1), i=0 , j=0)
If j=0
j=ArraySize(L())
Line 1,618 ⟶ 2,010:
Stooge_Sort(L(), i, j-t)
EndIf
EndProcedure</langsyntaxhighlight>
Implementation may be as<langsyntaxhighlight PureBasiclang="purebasic">Define AmountOfPosts=(?Stop_Data-?Start_data)/SizeOf(Integer)
Dim Xyz.i(AmountOfPosts)
CopyMemory(?Start_data, @Xyz(), ?Stop_Data-?Start_data)
Line 1,633 ⟶ 2,025:
Data.i 1, 4, 5, 3, -6, 3, 7, 10, -2, -5, 7, 5, 9, -3, 7
Stop_Data:
EndDataSection</langsyntaxhighlight>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">>>> data = [1, 4, 5, 3, -6, 3, 7, 10, -2, -5, 7, 5, 9, -3, 7]
>>> def stoogesort(L, i=0, j=None):
if j is None:
Line 1,650 ⟶ 2,042:
 
>>> stoogesort(data)
[-6, -5, -3, -2, 1, 3, 3, 4, 5, 5, 7, 7, 7, 9, 10]</langsyntaxhighlight>
 
This alternate solution uses a wrapper function
to compute the initial value of ''j''
rather than detecting the sentinel value ''None''.
<langsyntaxhighlight lang="python">>>> def stoogesort(L, i, j):
if L[j] < L[i]:
L[i], L[j] = L[j], L[i]
Line 1,669 ⟶ 2,061:
>>> data = [1, 4, 5, 3, -6, 3, 7, 10, -2, -5, 7, 5, 9, -3, 7]
>>> stooge(data)
[-6, -5, -3, -2, 1, 3, 3, 4, 5, 5, 7, 7, 7, 9, 10]</langsyntaxhighlight>
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="quackery"> [ 2 * 3 /mod 0 > + ] is twothirds ( n --> n )
 
[ dup 0 peek over -1 peek
2dup > iff
[ rot 0 poke -1 poke ]
else 2drop ] is swapends ( [ --> [ )
 
[ swapends
dup size 3 < if done
dup size twothirds split
swap recurse swap join
dup size 3 / split
recurse join
dup size twothirds split
swap recurse swap join ] is stoogesort ( [ --> [ )
 
[] 33 times [ 90 random 10 + join ]
dup echo cr
stoogesort echo</syntaxhighlight>
 
{{out}}
 
<pre>[ 32 45 68 88 88 89 45 20 86 74 31 91 24 77 87 91 89 76 41 76 84 14 99 72 98 73 79 11 22 75 66 27 34 ]
[ 11 14 20 22 24 27 31 32 34 41 45 45 66 68 72 73 74 75 76 76 77 79 84 86 87 88 88 89 89 91 91 98 99 ]
</pre>
 
=={{header|R}}==
<langsyntaxhighlight Rlang="r">stoogesort = function(vect) {
i = 1
j = length(vect)
Line 1,688 ⟶ 2,108:
k = stoogesort(v)
v
k</langsyntaxhighlight>
{{out}}
<pre>
Line 1,696 ⟶ 2,116:
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
(define (stooge-sort xs [i 0] [j (- (vector-length xs) 1)])
Line 1,709 ⟶ 2,129:
(stooge-sort xs i (- j t)))
xs)
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" line>sub stoogesort( @L, $i = 0, $j = @L.end ) {
@L[$j,$i] = @L[$i,$j] if @L[$i] > @L[$j];
 
my $interval = $j - $i;
if $interval > 1 {
my $t = ( $interval + 1 ) div 3;
stoogesort( @L, $i , $j-$t );
stoogesort( @L, $i+$t, $j );
stoogesort( @L, $i , $j-$t );
}
return @L;
}
 
my @L = 1, 4, 5, 3, -6, 3, 7, 10, -2, -5;
 
stoogesort(@L).Str.say;
</syntaxhighlight>
 
=={{header|REXX}}==
This REXX example starts an array at element zero &nbsp; (but any integer could be used); &nbsp; a zero-
<br>zerobased index was used because the algorithm shown in the Rosetta Code task used zero.
<langsyntaxhighlight REXXlang="rexx">/*REXX program sorts an integer array @. [the first element starts at index zero].*/
parse arg N . /*obtain an optional argument from C.L.*/
if N=='' | N=="," then N=19 /*Not specified? Then use the default.*/
wV=0 call gen@ /*widthgenerate ofa thetype largestof scattered value,array. so far.*/
do k=0 to N; @.k=k*2 + k*-1**k /*generate some kinda scattered numbers*/
if @.k//7==0 then @.k= -100 -k /*Multiple of 7? Then make a negative#*/
wV=max(wV, length(@.k)) /*find maximum width of values, so far.*/
end /*k*/ /* [↑] // is REXX division remainder.*/
wN=length(N) /*width of the largest element number.*/
call show 'before sort' /*show the before array elements. */
say copies('▒', wN+wV+ 50) /*show a separator line (between shows)*/
Line 1,728 ⟶ 2,164:
call show ' after sort' /*show the after array elements. */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
gen@: wV= 0; do k=0 to N; @.k= k*2 + k*-1**k; if @.k//7==0 then @.k= -100 - k
wV= max(wV, length(@.k) ); end; wN=length(N); return
/*──────────────────────────────────────────────────────────────────────────────────────*/
show: do j=0 to N; say right('element',22) right(j,wN) arg(1)":" right(@.j,wV); end;return
Line 1,738 ⟶ 2,177:
call stoogeSort i , j-t /* " " */
end
return</langsyntaxhighlight>
'''{{out|output''' |text=&nbsp; when using the default (internal generated) inputs:}}
 
<pre>
(Shown at three-quarter size.)
 
<pre style="font-size:75%">
element 0 before sort: -100
element 1 before sort: 1
Line 1,785 ⟶ 2,227:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
test = [4, 65, 2, -31, 0, 99, 2, 83, 782, 1]
stoogeSort(test, 1, len(test))
Line 1,804 ⟶ 2,246:
stoogeSort(list, i, j-t) ok
return list
</langsyntaxhighlight>
Output:
<pre>
-31 0 1 2 2 4 65 83 99 782
</pre>
 
=={{header|RPL}}==
« 0 → start end t
« DUP start GET OVER end GET
'''IF''' DUP2 > '''THEN'''
ROT start ROT PUT
end ROT PUT
'''ELSE''' DROP2 '''END'''
'''IF''' end start - 2 ≥ '''THEN'''
end start - 1 + 3 / FLOOR 't' STO
start end t - <span style="color:blue">STOOGESORT</span>
start t + end <span style="color:blue">STOOGESORT</span>
start end t - <span style="color:blue">STOOGESORT</span>
'''END'''
» » '<span style="color:blue">STOOGESORT</span>' STO <span style="color:grey">''@ ( { } start end → { } )''
 
{ 1 4 5 3 -6 3 7 10 -2 -5 7 5 9 -3 7 } 1 OVER SIZE <span style="color:blue">STOOGESORT</span>
{{out}}
<pre>
1: { -6 - 5 -3 -2 1 3 3 4 5 5 7 7 7 9 10 }
</pre>
Stooge sort is 436 times slower than the built-in <code>SORT</code> function on an HP-50g.
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">class Array
def stoogesort
self.dup.stoogesort!
Line 1,830 ⟶ 2,294:
end
 
p [1,4,5,3,-6,3,7,10,-2,-5].stoogesort </langsyntaxhighlight>
 
{{out}}
Line 1,836 ⟶ 2,300:
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">fn stoogesort<E>(a: &mut [E])
where E: PartialOrd
{
Line 1,857 ⟶ 2,321:
stoogesort(&mut numbers);
println!("After: {:?}", &numbers);
}</langsyntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight Scalalang="scala">object StoogeSort extends App {
def stoogeSort(a: Array[Int], i: Int, j: Int) {
if (a(j) < a(i)) {
Line 1,879 ⟶ 2,343:
stoogeSort(a, 0, a.length - 1)
println(s"Sorted : ${a.mkString(", ")}")
}</langsyntaxhighlight>
 
See it running in your browser by [https://scastie.scala-lang.org/QTCrb5SNTVqDNC6oRQRmZw Scastie (JVM)].
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func stooge(x, i, j) {
if (x[j] < x[i]) {
x.swap(i, j)
Line 1,900 ⟶ 2,365:
say "Before #{a}"
stooge(a, 0, a.end)
say "After #{a}"</langsyntaxhighlight>
 
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
<langsyntaxhighlight lang="smalltalk">OrderedCollection extend [
stoogeSortFrom: i to: j [
(self at: j) < (self at: i)
Line 1,927 ⟶ 2,392:
test := #( 1 4 5 3 -6 3 7 10 -2 -5) asOrderedCollection.
test stoogeSort.
test printNl.</langsyntaxhighlight>
 
Here is a "functional" variation (a 1:1 adaption of the original algorithm):
<syntaxhighlight lang="smalltalk">stoogesort := [:L :i :j |
(L at:i) > (L at:j) ifTrue:[
L swap:i with:j
].
(j - i + 1) > 2 ifTrue:[
t := ((j - i + 1) / 3) floor.
stoogesort value:L value:i value:j-t.
stoogesort value:L value:i+t value:j.
stoogesort value:L value:i value:j-t.
].
].
 
a := #(1 4 5 3 -6 3 7 10 -2 -5 7 5 9 -3 7) copy.
stoogesort value:a value:1 value:a size.
Transcript showCR:a</syntaxhighlight>
 
Output:
#(-6 -5 -3 -2 1 3 3 4 5 5 7 7 7 9 10)
 
=={{header|Swift}}==
<langsyntaxhighlight Swiftlang="swift">func stoogeSort(inout arr:[Int], _ i:Int = 0, var _ j:Int = -1) {
if j == -1 {
j = arr.count - 1
Line 1,951 ⟶ 2,436:
stoogeSort(&a)
 
println(a)</langsyntaxhighlight>
{{out}}
<pre>
Line 1,959 ⟶ 2,444:
=={{header|Tcl}}==
{{works with|Tcl|8.5}}
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
proc stoogesort {L {i 0} {j -42}} {
Line 1,980 ⟶ 2,465:
}
 
stoogesort {1 4 5 3 -6 3 7 10 -2 -5}</langsyntaxhighlight>
{{out}}
<pre>-6 -5 -2 1 3 3 4 5 7 10</pre>
 
=={{header|True BASIC}}==
<syntaxhighlight lang="qbasic">SUB swap (vb1,vb2)
LET temp = vb1
LET vb1 = vb2
LET vb2 = temp
END SUB
 
SUB stoogesort (l(),i,j)
IF l(j) < l(i) THEN CALL swap (L(i), L(j))
IF (j-i) > 1 THEN
LET t = (j-i+1)/3
CALL stoogesort (l(), i, j-t)
CALL stoogesort (L(), i + t, j)
CALL stoogesort (L(), i, j - t)
END IF
END SUB
 
RANDOMIZE
LET arraysize = 10
DIM x(0)
MAT REDIM x(arraysize)
 
PRINT "unsort: ";
FOR i = 1 TO arraysize
LET x(i) = INT(RND*100)
PRINT x(i); " ";
NEXT i
PRINT
 
CALL stoogesort (x(), 1, arraysize)
 
PRINT " sort: ";
FOR i = 1 TO arraysize
PRINT x(i); " ";
NEXT i
PRINT
END</syntaxhighlight>
 
=={{header|uBasic/4tH}}==
{{trans|BBC BASIC}}
<syntaxhighlight lang="text">PRINT "Stooge sort:"
n = FUNC (_InitArray)
PROC _ShowArray (n)
Line 2,037 ⟶ 2,560:
PRINT
RETURN</langsyntaxhighlight>
 
=={{header|Wren}}==
<syntaxhighlight lang="wren">var stoogeSort // recursive
stoogeSort = Fn.new { |a, i, j|
if (a[j] < a[i]) {
var t = a[i]
a[i] = a[j]
a[j] = t
}
if (j - i > 1) {
var t = ((j - i + 1)/3).floor
stoogeSort.call(a, i, j - t)
stoogeSort.call(a, i + t, j)
stoogeSort.call(a, i, j - t)
}
}
 
var array = [ [4, 65, 2, -31, 0, 99, 2, 83, 782, 1], [7, 5, 2, 6, 1, 4, 2, 6, 3] ]
for (a in array) {
System.print("Before: %(a)")
stoogeSort.call(a, 0, a.count-1)
System.print("After : %(a)")
System.print()
}</syntaxhighlight>
 
{{out}}
<pre>
Before: [4, 65, 2, -31, 0, 99, 2, 83, 782, 1]
After : [-31, 0, 1, 2, 2, 4, 65, 83, 99, 782]
 
Before: [7, 5, 2, 6, 1, 4, 2, 6, 3]
After : [1, 2, 2, 3, 4, 5, 6, 6, 7]
</pre>
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">code ChOut=8, IntOut=11; \intrinsic routines
 
proc StoogeSort(L, I, J); \Sort array L
Line 2,059 ⟶ 2,615:
StoogeSort(A, 0, 10-1);
for I:= 0 to 10-1 do [IntOut(0, A(I)); ChOut(0, ^ )];
]</langsyntaxhighlight>
 
{{out}}
Line 2,069 ⟶ 2,625:
Based on pseudocode, except using Yorick's 1-based arrays.
Sorts in place.
<langsyntaxhighlight lang="yorick">func stoogesort(&L, i, j) {
if(is_void(i)) i = 1;
if(is_void(j)) j = numberof(L);
Line 2,080 ⟶ 2,636:
stoogesort, L, i, j-t;
}
}</langsyntaxhighlight>
 
Example interactive use:
Line 2,089 ⟶ 2,645:
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn stoogeSort(list,i=0,j=Void){ if(Void==j) j=list.len() - 1; // default parameters set before call
if(list[j]<list[i]) list.swap(i,j);
if(j - i >1){
Line 2,098 ⟶ 2,654:
}
list
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">stoogeSort(List(67,-201,0,9,9,231,4)).println();</langsyntaxhighlight>
{{out}}
<pre>
1,150

edits