Sorting algorithms/Bead sort: Difference between revisions

m
m (→‎{{header|Wren}}: Minor tidy)
 
(82 intermediate revisions by 38 users not shown)
Line 1:
{{task|Sorting Algorithms}}{{Sorting Algorithm}}
[[Category:Sorting]]
In this task, the goal is to sort an array of positive integers using the [[wp:Bead_sort|Bead Sort Algorithm]].
{{Sorting Algorithm}}
 
;Task:
Algorithm has O(S), where S is the sum of the integers in the input set: Each bead is moved individually. This is the case when bead sort is implemented without a mechanism to assist in finding empty spaces below the beads, such as in software implementations.
Sort an array of positive integers using the [[wp:Bead_sort|Bead Sort Algorithm]].
 
A   ''bead sort''   is also known as a   ''gravity sort''.
 
 
Algorithm has   O(S),   where   S   is the sum of the integers in the input set:   Each bead is moved individually.
 
This is the case when bead sort is implemented without a mechanism to assist in finding empty spaces below the beads, such as in software implementations.
<br><br>
 
=={{header|11l}}==
{{trans|Nim}}
 
<syntaxhighlight lang="11l">F bead_sort(&a)
V maxv = max(a)
V beads = [0] * (maxv * a.len)
 
L(i) 0 .< a.len
L(j) 0 .< a[i]
beads[i * maxv + j] = 1
 
L(j) 0 .< maxv
V sum = 0
L(i) 0 .< a.len
sum += beads[i * maxv + j]
beads[i * maxv + j] = 0
 
L(i) a.len - sum .< a.len
beads[i * maxv + j] = 1
 
L(i) 0 .< a.len
V j = 0
L j < maxv & beads[i * maxv + j] > 0
j++
a[i] = j
 
V a = [5, 3, 1, 7, 4, 1, 1, 20]
bead_sort(&a)
print(a)</syntaxhighlight>
 
{{out}}
<pre>
[1, 1, 1, 3, 4, 5, 7, 20]
</pre>
 
=={{header|360 Assembly}}==
{{trans|ooRexx}}
For maximum compatibility, this program uses only the basic instruction set (S/360)
and two ASSIST macros (XDECO,XPRNT) to keep it as short as possible.
<syntaxhighlight lang="360asm">* Bead Sort 11/05/2016
BEADSORT CSECT
USING BEADSORT,R13 base register
SAVEAR B STM-SAVEAR(R15) skip savearea
DC 17F'0' savearea
STM STM R14,R12,12(R13) prolog
ST R13,4(R15) "
ST R15,8(R13) "
LR R13,R15 "
LA R6,1 i=1
LOOPI1 CH R6,=AL2(N) do i=1 to hbound(z)
BH ELOOPI1 leave i
LR R1,R6 i
SLA R1,1 <<1
LH R2,Z-2(R1) z(i)
CH R2,LO if z(i)<lo
BNL EIHO then
STH R2,LO lo=z(i)
EIHLO CH R2,HI if z(i)>hi
BNH EIHHI then
STH R2,HI hi=z(i)
EIHHI LA R6,1(R6) iterate i
B LOOPI1 next i
ELOOPI1 LA R9,1 1
SH R9,LO -lo+1
LA R6,1 i=1
LOOPI2 CH R6,=AL2(N) do i=1 to hbound(z)
BH ELOOPI2 leave i
LR R1,R6 i
SLA R1,1 <<1
LH R3,Z-2(R1) z(i)
AR R3,R9 z(i)+o
IC R2,BEADS-1(R3) beads(l)
LA R2,1(R2) beads(l)+1
STC R2,BEADS-1(R3) beads(l)=beads(l)+1
LA R6,1(R6) iterate i
B LOOPI2 next i
ELOOPI2 SR R8,R8 k=0
LH R6,LO i=lo
LOOPI3 CH R6,HI do i=lo to hi
BH ELOOPI3 leave i
LA R7,1 j=1
SR R10,R10 clear r10
LR R1,R6 i
AR R1,R9 i+o
IC R10,BEADS-1(R1) beads(i+o)
LOOPJ3 CR R7,R10 do j=1 to beads(i+o)
BH ELOOPJ3 leave j
LA R8,1(R8) k=k+1
LR R1,R8 k
SLA R1,1 <<1
STH R6,S-2(R1) s(k)=i
LA R7,1(R7) iterate j
B LOOPJ3 next j
ELOOPJ3 AH R6,=H'1' iterate i
B LOOPI3 next i
ELOOPI3 LA R7,1 j=1
LOOPJ4 CH R7,=H'2' do j=1 to 2
BH ELOOPJ4 leave j
CH R7,=H'1' if j<>1
BE ONE then
MVC PG(7),=C'sorted:' zap
ONE LA R10,PG+7 pgi=@pg+7
LA R6,1 i=1
LOOPI4 CH R6,=AL2(N) do i=1 to hbound(z)
BH ELOOPI4 leave i
CH R7,=H'1' if j=1
BNE TWO then
LR R1,R6 i
SLA R1,1 <<1
LH R11,Z-2(R1) zs=z(i)
B XDECO else
TWO LR R1,R6 i
SLA R1,1 <<1
LH R11,S-2(R1) zs=s(i)
XDECO XDECO R11,XDEC edit zs
MVC 0(6,R10),XDEC+6 output zs
LA R10,6(R10) pgi=pgi+6
LA R6,1(R6) iterate i
B LOOPI4 next i
ELOOPI4 XPRNT PG,80 print buffer
LA R7,1(R7) iterate j
B LOOPJ4 next j
ELOOPJ4 L R13,4(0,R13) epilog
LM R14,R12,12(R13) "
XR R15,R15 "
BR R14 "
LTORG literal table
N EQU (S-Z)/2 number of items
Z DC H'5',H'3',H'1',H'7',H'-1',H'4',H'9',H'-12'
DC H'2001',H'-2010',H'17',H'0'
S DS (N)H s same size as z
LO DC H'32767' 2**31-1
HI DC H'-32768' -2**31
PG DC CL80' raw:' buffer
XDEC DS CL12 temp
BEADS DC 4096X'00' beads
YREGS
END BEADSORT</syntaxhighlight>
{{out}}
<pre>
raw: 5 3 1 7 -1 4 9 -12 2001 -2010 17 0
sorted: -2010 -12 -1 0 1 3 4 5 7 9 17 2001
</pre>
 
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program beadSort64.s */
/* En français tri par gravité ou tri par bille (ne pas confondre
avec tri par bulle (bubble sort)) */
/*******************************************/
/* Constantes file */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
 
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessSortOk: .asciz "Table sorted.\n"
szMessSortNok: .asciz "Table not sorted !!!!!.\n"
sMessResult: .asciz "Value : @ \n"
szCarriageReturn: .asciz "\n"
.align 4
#TableNumber: .quad 1,3,6,2,5,9,10,8,4,7
TableNumber: .quad 10,9,8,7,6,5,4,3,2,1
.equ NBELEMENTS, (. - TableNumber) / 8
//.equ NBELEMENTS, 4 // for others tests
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: // entry of program
1:
ldr x0,qAdrTableNumber // address number table
mov x1,#NBELEMENTS // number of élements
bl beadSort
ldr x0,qAdrTableNumber // address number table
mov x1,#NBELEMENTS // number of élements
bl displayTable
ldr x0,qAdrTableNumber // address number table
mov x1,#NBELEMENTS // number of élements
bl isSorted // control sort
cmp x0,#1 // sorted ?
beq 2f
ldr x0,qAdrszMessSortNok // no !! error sort
bl affichageMess
b 100f
2: // yes
ldr x0,qAdrszMessSortOk
bl affichageMess
100: // standard end of the program
mov x0, #0 // return code
mov x8, #EXIT // request to exit program
svc #0 // perform the system call
qAdrszCarriageReturn: .quad szCarriageReturn
qAdrsMessResult: .quad sMessResult
qAdrTableNumber: .quad TableNumber
qAdrszMessSortOk: .quad szMessSortOk
qAdrszMessSortNok: .quad szMessSortNok
/******************************************************************/
/* control sorted table */
/******************************************************************/
/* x0 contains the address of table */
/* x1 contains the number of elements > 0 */
/* x0 return 0 if not sorted 1 if sorted */
isSorted:
stp x2,lr,[sp,-16]! // save registers
stp x3,x4,[sp,-16]! // save registers
mov x2,#0
ldr x4,[x0,x2,lsl #3] // load A[0]
1:
add x2,x2,#1
cmp x2,x1 // end ?
bge 99f
ldr x3,[x0,x2, lsl #3] // load A[i]
cmp x3,x4 // compare A[i],A[i-1]
blt 98f // smaller -> error -> return
mov x4,x3 // no -> A[i-1] = A[i]
b 1b // and loop
98:
mov x0,#0 // error
b 100f
99:
mov x0,#1 // ok -> return
100:
ldp x2,x3,[sp],16 // restaur 2 registers
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/******************************************************************/
/* bead sort */
/******************************************************************/
/* x0 contains the address of table */
/* x1 contains the number of element */
/* Caution registers x2-x12 are not saved */
beadSort:
stp x1,lr,[sp,-16]! // save registers
mov x12,x1 // save elements number
//search max
ldr x10,[x0] // load value A[0] in max
mov x4,#1
1: // loop search max
cmp x4,x12 // end ?
bge 21f // yes
ldr x2,[x0,x4,lsl #3] // load value A[i]
cmp x2,x10 // compare with max
csel x10,x2,x10,gt // if greather
add x4,x4,#1
b 1b // loop
21:
mul x5,x10,x12 // max * elements number
lsl x5,x5,#3 // 8 bytes for each number
sub sp,sp,x5 // allocate on the stack
mov fp,sp // frame pointer = stack address
// marks beads
mov x3,x0 // save table address
mov x0,#0 // start index x
2:
mov x1,#0 // index y
ldr x8,[x3,x0,lsl #3] // load A[x]
mul x6,x0,x10 // compute bead x
3:
add x9,x6,x1 // compute bead y
mov x4,#1 // value to store
str x4,[fp,x9,lsl #3] // store to stack area
add x1,x1,#1
cmp x1,x8
blt 3b
31: // init to zéro the bead end
cmp x1,x10 // max ?
bge 32f
add x9,x6,x1 // compute bead y
mov x4,#0
str x4,[fp,x9,lsl #3]
add x1,x1,#1
b 31b
32:
add x0,x0,#1 // increment x
cmp x0,x12 // end ?
blt 2b
// count beads
mov x1,#0 // y
4:
mov x0,#0 // start index x
mov x8,#0 // sum
5:
mul x6,x0,x10 // compute bead x
add x9,x6,x1 // compute bead y
ldr x4,[fp,x9,lsl #3]
add x8,x8,x4
mov x4,#0
str x4,[fp,x9,lsl #3] // raz bead
add x0,x0,#1
cmp x0,x12
blt 5b
sub x0,x12,x8 // compute end - sum
6:
mul x6,x0,x10 // compute bead x
add x9,x6,x1 // compute bead y
mov x4,#1
str x4,[fp,x9,lsl #3] // store new bead at end
add x0,x0,#1
cmp x0,x12
blt 6b
add x1,x1,#1
cmp x1,x10
blt 4b
// final compute
mov x0,#0 // start index x
7:
mov x1,#0 // start index y
mul x6,x0,x10 // compute bead x
8:
add x9,x6,x1 // compute bead y
ldr x4,[fp,x9,lsl #3] // load bead [x,y]
add x1,x1,#1 // add to x1 before str (index start at zéro)
cmp x4,#1
bne 9f
str x1,[x3,x0, lsl #3] // store A[x]
9:
cmp x1,x10 // compare max
blt 8b
add x0,x0,#1
cmp x0,x12 // end ?
blt 7b
 
mov x0,#0
add sp,sp,x5 // stack alignement
100:
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
/******************************************************************/
/* Display table elements */
/******************************************************************/
/* x0 contains the address of table */
/* x1 contains elements number */
displayTable:
stp x1,lr,[sp,-16]! // save registers
stp x2,x3,[sp,-16]! // save registers
mov x2,x0 // table address
mov x4,x1 // elements number
mov x3,#0
1: // loop display table
ldr x0,[x2,x3,lsl #3]
ldr x1,qAdrsZoneConv
bl conversion10 // décimal conversion
ldr x0,qAdrsMessResult
ldr x1,qAdrsZoneConv // insert conversion
bl strInsertAtCharInc
bl affichageMess // display message
add x3,x3,#1
cmp x3,x4 // end ?
blt 1b // no -> loop
ldr x0,qAdrszCarriageReturn
bl affichageMess
100:
ldp x2,x3,[sp],16 // restaur 2 registers
ldp x1,lr,[sp],16 // restaur 2 registers
ret // return to address lr x30
qAdrsZoneConv: .quad sZoneConv
 
/********************************************************/
/* File Include fonctions */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
 
</syntaxhighlight>
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
 
/* ARM assembly Raspberry PI */
/* program beadSort.s */
/* En français tri par gravité ou tri par bille (ne pas confondre
avec tri par bulle (bubble sort) */
/* REMARK 1 : this program use routines in a include file
see task Include a file language arm assembly
for the routine affichageMess conversion10
see at end of this program the instruction include */
/* for constantes see task include a file in arm assembly */
/************************************/
/* Constantes */
/************************************/
.include "../constantes.inc"
 
/*********************************/
/* Initialized data */
/*********************************/
.data
szMessSortOk: .asciz "Table sorted.\n"
szMessSortNok: .asciz "Table not sorted !!!!!.\n"
sMessResult: .asciz "Value : @ \n"
szCarriageReturn: .asciz "\n"
.align 4
TableNumber: .int 1,3,6,2,5,9,10,8,4,7
#TableNumber: .int 10,9,8,7,6,5,4,3,2,1
.equ NBELEMENTS, (. - TableNumber) / 4
@.equ NBELEMENTS, 4 @ for others tests
/*********************************/
/* UnInitialized data */
/*********************************/
.bss
sZoneConv: .skip 24
/*********************************/
/* code section */
/*********************************/
.text
.global main
main: @ entry of program
1:
ldr r0,iAdrTableNumber @ address number table
mov r1,#NBELEMENTS @ number of élements
bl beadSort
ldr r0,iAdrTableNumber @ address number table
mov r1,#NBELEMENTS @ number of élements
bl displayTable
ldr r0,iAdrTableNumber @ address number table
mov r1,#NBELEMENTS @ number of élements
bl isSorted @ control sort
cmp r0,#1 @ sorted ?
beq 2f
ldr r0,iAdrszMessSortNok @ no !! error sort
bl affichageMess
b 100f
2: @ yes
ldr r0,iAdrszMessSortOk
bl affichageMess
100: @ standard end of the program
mov r0, #0 @ return code
mov r7, #EXIT @ request to exit program
svc #0 @ perform the system call
iAdrszCarriageReturn: .int szCarriageReturn
iAdrsMessResult: .int sMessResult
iAdrTableNumber: .int TableNumber
iAdrszMessSortOk: .int szMessSortOk
iAdrszMessSortNok: .int szMessSortNok
/******************************************************************/
/* control sorted table */
/******************************************************************/
/* r0 contains the address of table */
/* r1 contains the number of elements > 0 */
/* r0 return 0 if not sorted 1 if sorted */
isSorted:
push {r2-r4,lr} @ save registers
mov r2,#0
ldr r4,[r0,r2,lsl #2] @ load A[0]
1:
add r2,#1
cmp r2,r1 @ end ?
movge r0,#1 @ yes -> ok -> return
bge 100f
ldr r3,[r0,r2, lsl #2] @ load A[i]
cmp r3,r4 @ compare A[i],A[i-1]
movlt r0,#0 @ smaller ?
blt 100f @ yes -> error -> return
mov r4,r3 @ no -> A[i-1] = A[i]
b 1b @ and loop
100:
pop {r2-r4,lr}
bx lr @ return
/******************************************************************/
/* bead sort */
/******************************************************************/
/* r0 contains the address of table */
/* r1 contains the number of element */
beadSort:
push {r1-r12,lr} @ save registers
mov r12,r1 @ save elements number
@search max
ldr r10,[r0] @ load value A[0] in max
mov r4,#1
1: @ loop search max
cmp r4,r12 @ end ?
bge 21f @ yes
ldr r2,[r0,r4,lsl #2] @ load value A[i]
cmp r2,r10 @ compare with max
movgt r10,r2 @ if greather
add r4,r4,#1
b 1b @ loop
21:
mul r5,r10,r12 @ max * elements number
lsl r5,r5,#2 @ 4 bytes for each number
sub sp,sp,r5 @ allocate on the stack
mov fp,sp @ frame pointer = stack address
@ marks beads
mov r3,r0 @ save table address
mov r0,#0 @ start index x
2:
mov r1,#0 @ index y
ldr r7,[r3,r0,lsl #2] @ load A[x]
mul r6,r0,r10 @ compute bead x
3:
add r9,r6,r1 @ compute bead y
mov r4,#1 @ value to store
str r4,[fp,r9,lsl #2] @ store to stack area
add r1,r1,#1
cmp r1,r7
blt 3b
31: @ init to zéro the bead end
cmp r1,r10 @ max ?
bge 32f
add r9,r6,r1 @ compute bead y
mov r4,#0
str r4,[fp,r9,lsl #2]
add r1,r1,#1
b 31b
32:
add r0,r0,#1 @ increment x
cmp r0,r12 @ end ?
blt 2b
@ count beads
mov r1,#0 @ y
4:
mov r0,#0 @ start index x
mov r8,#0 @ sum
5:
mul r6,r0,r10 @ compute bead x
add r9,r6,r1 @ compute bead y
ldr r4,[fp,r9,lsl #2]
add r8,r8,r4
mov r4,#0
str r4,[fp,r9,lsl #2]
add r0,r0,#1
cmp r0,r12
blt 5b
sub r0,r12,r8
6:
mul r6,r0,r10 @ compute bead x
add r9,r6,r1 @ compute bead y
mov r4,#1
str r4,[fp,r9,lsl #2]
add r0,r0,#1
cmp r0,r12
blt 6b
add r1,r1,#1
cmp r1,r10
blt 4b
@ suite
mov r0,#0 @ start index
7:
mov r1,#0
mul r6,r0,r10 @ compute bead x
8:
add r9,r6,r1 @ compute bead y
ldr r4,[fp,r9,lsl #2]
add r1,r1,#1 @ add to r1 before str (index start at zéro)
cmp r4,#1
streq r1,[r3,r0, lsl #2] @ store A[i]
cmp r1,r10 @ compare max
blt 8b
add r0,r0,#1
cmp r0,r12 @ end ?
blt 7b
 
mov r0,#0
add sp,sp,r5 @ stack alignement
100:
pop {r1-r12,lr}
bx lr @ return
/******************************************************************/
/* Display table elements */
/******************************************************************/
/* r0 contains the address of table */
/* r1 contains elements number */
displayTable:
push {r0-r4,lr} @ save registers
mov r2,r0 @ table address
mov r4,r1 @ elements number
mov r3,#0
1: @ loop display table
ldr r0,[r2,r3,lsl #2]
ldr r1,iAdrsZoneConv
bl conversion10 @ décimal conversion
ldr r0,iAdrsMessResult
ldr r1,iAdrsZoneConv @ insert conversion
bl strInsertAtCharInc
bl affichageMess @ display message
add r3,r3,#1
cmp r3,r4 @ end ?
blt 1b @ no -> loop
ldr r0,iAdrszCarriageReturn
bl affichageMess
100:
pop {r0-r4,lr}
bx lr
iAdrsZoneConv: .int sZoneConv
/***************************************************/
/* ROUTINES INCLUDE */
/***************************************************/
.include "../affichage.inc"
 
</syntaxhighlight>
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">beadSort: function [items][
a: new items
m: neg infinity
s: 0
 
loop a 'x [
if x > m -> m: x
]
 
beads: array.of: m * size a 0
 
loop 0..dec size a 'i [
loop 0..dec a\[i] 'j ->
beads\[j + i * m]: 1
]
 
loop 0..dec m 'j [
s: 0
loop 0..dec size a 'i [
s: s + beads\[j + i*m]
beads\[j + i*m]: 0
]
 
loop ((size a)-s)..dec size a 'i ->
beads\[j + i*m]: 1
]
 
loop 0..dec size a 'i [
j: 0
while [and? [j < m] [beads\[j + i*m] > 0]] -> j: j + 1
a\[i]: j
]
 
return a
]
 
print beadSort [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">BeadSort(data){
Pole:=[] , TempObj:=[], Result:=[]
for, i, v in data {
Line 28 ⟶ 697:
}
return Result
}</langsyntaxhighlight>
Examples:<langsyntaxhighlight AutoHotkeylang="autohotkey">for i, val in BeadSort([54,12,87,56,36])
res := val (res?",":"") res
MsgBox % res</langsyntaxhighlight>
{{out}}
Outputs:<pre>12,36,54,56,87</pre>
<pre>12,36,54,56,87</pre>
 
=={{header|BCPL}}==
<syntaxhighlight lang="bcpl">get "libhdr"
 
let max(A, len) = valof
$( let x = 0
for i=0 to len-1
if x<A!i do x := A!i
resultis x
$)
 
let beadsort(A, len) be
$( let size = max(A, len)
let tvec = getvec(size-1)
for i=0 to size-1 do tvec!i := 0
for i=0 to len-1
for j=0 to A!i-1 do tvec!j := tvec!j + 1
for i=len-1 to 0 by -1
$( let n = 0
for j=0 to size-1
if tvec!j > 0
$( tvec!j := tvec!j - 1
n := n + 1
$)
A!i := n
$)
freevec(tvec)
$)
 
let write(s, A, len) be
$( writes(s)
for i=0 to len-1 do writed(A!i, 4)
wrch('*N')
$)
let start() be
$( let array = table 10,1,5,5,9,2,20,6,8,4
let length = 10
write("Before: ", array, length)
beadsort(array, length)
write("After: ", array, length)
$)</syntaxhighlight>
{{out}}
<pre>Before: 10 1 5 5 9 2 20 6 8 4
After: 1 2 4 5 5 6 8 9 10 20</pre>
 
=={{header|C}}==
A rather straightforward implementation; since we do not use dynamic matrix, we have to know the maximum value in the array in advance. Requires (max * length) bytes for beads; if memory is of concern, bytes can be replaced by bits.
Requires (max * length) bytes for beads; if memory is of concern, bytes can be replaced by bits.
 
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
 
Line 83 ⟶ 799:
 
return 0;
}</langsyntaxhighlight>
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">//this algorithm only works with positive, whole numbers.
//O(2n) time complexity where n is the summation of the whole list to be sorted.
//O(3n) space complexity.
Line 134 ⟶ 850:
for(unsigned int i=0; i<sorted.size(); i++)
cout << sorted[i] << ' ';
}</langsyntaxhighlight>
 
=={{header|Clojure}}==
{{trans|Haskell}}
<langsyntaxhighlight Clojurelang="clojure">(defn transpose [xs]
(loop [ret [], remain xs]
(if (empty? remain)
Line 147 ⟶ 863:
(defn bead-sort [xs]
(->> xs
(map #(repeat 1 % 1))
transpose
transpose
(map #(reduce + %))))
;; This algorithm does not work if collection has zero
(-> [5 2 4 1 3 3 9] bead-sort println)
</syntaxhighlight>
</lang>
 
{{out}}
<pre>(9 5 4 3 3 2 1)</pre>
 
=={{header|COBOL}}==
{{works with|GnuCOBOL}}
<syntaxhighlight lang="cobol"> >>SOURCE FORMAT FREE
*> This code is dedicated to the public domain
*> This is GNUCOBOL 2.0
identification division.
program-id. beadsort.
environment division.
configuration section.
repository. function all intrinsic.
data division.
working-storage section.
01 filler.
03 row occurs 9 pic x(9).
03 r pic 99.
03 r1 pic 99.
03 r2 pic 99.
03 pole pic 99.
03 a-lim pic 99 value 9.
03 a pic 99.
03 array occurs 9 pic 9.
01 NL pic x value x'0A'.
procedure division.
start-beadsort.
 
*> fill the array
Output:
compute a = random(seconds-past-midnight)
perform varying a from 1 by 1 until a > a-lim
compute array(a) = random() * 10
end-perform
 
perform display-array
display space 'initial array'
 
*> distribute the beads
perform varying r from 1 by 1 until r > a-lim
move all '.' to row(r)
perform varying pole from 1 by 1 until pole > array(r)
move 'o' to row(r)(pole:1)
end-perform
end-perform
display NL 'initial beads'
perform display-beads
 
*> drop the beads
perform varying pole from 1 by 1 until pole > a-lim
move a-lim to r2
perform find-opening
compute r1 = r2 - 1
perform find-bead
perform until r1 = 0 *> no bead or no opening
*> drop the bead
move '.' to row(r1)(pole:1)
move 'o' to row(r2)(pole:1)
*> continue up the pole
compute r2 = r2 - 1
perform find-opening
compute r1 = r2 - 1
perform find-bead
end-perform
end-perform
display NL 'dropped beads'
perform display-beads
 
*> count the beads in each row
perform varying r from 1 by 1 until r > a-lim
move 0 to array(r)
inspect row(r) tallying array(r)
for all 'o' before initial '.'
end-perform
 
perform display-array
display space 'sorted array'
 
stop run
.
find-opening.
perform varying r2 from r2 by -1
until r2 = 1 or row(r2)(pole:1) = '.'
continue
end-perform
.
find-bead.
perform varying r1 from r1 by -1
until r1 = 0 or row(r1)(pole:1) = 'o'
continue
end-perform
.
display-array.
display space
perform varying a from 1 by 1 until a > a-lim
display space array(a) with no advancing
end-perform
.
display-beads.
perform varying r from 1 by 1 until r > a-lim
display row(r)
end-perform
.
end program beadsort.</syntaxhighlight>
 
{{out}}
<pre>prompt$ cobc -xj beadsort.cob
 
3 2 1 6 1 6 4 9 7 initial array
 
initial beads
ooo......
oo.......
o........
oooooo...
o........
oooooo...
oooo.....
ooooooooo
ooooooo..
 
dropped beads
o........
o........
oo.......
ooo......
oooo.....
oooooo...
oooooo...
ooooooo..
ooooooooo
 
1 1 2 3 4 6 6 7 9 sorted array</pre>
 
=={{header|Common Lisp}}==
{{trans|Clojure}}
<syntaxhighlight lang="lisp">
(defun transpose (remain &optional (ret '()))
(if (null remain)
ret
(transpose (remove-if #'null (mapcar #'cdr remain))
(append ret (list (mapcar #'car remain))))))
 
(defun bead-sort (xs)
(mapcar #'length (transpose (transpose (mapcar (lambda (x) (make-list x :initial-element 1)) xs)))))
 
(bead-sort '(5 2 4 1 3 3 9))
</syntaxhighlight>
{{out}}
<pre>(9 5 4 3 3 2 1)</pre>
 
=={{header|D}}==
A functional-style solution.
<syntaxhighlight lang="d">import std.stdio, std.algorithm, std.range, std.array, std.functional;
 
alias repeat0 = curry!(repeat, 0);
 
// Currenty std.range.transposed doesn't work.
auto columns(R)(R m) pure /*nothrow*/ @safe /*@nogc*/ {
return m
.map!walkLength
.reduce!max
.iota
.map!(i => m.filter!(s => s.length > i).walkLength.repeat0);
}
 
auto beadSort(in uint[] data) pure /*nothrow @nogc*/ {
return data.map!repeat0.columns.columns.map!walkLength;
}
 
void main() {
[5, 3, 1, 7, 4, 1, 1].beadSort.writeln;
}</syntaxhighlight>
{{out}}
<pre>[7, 5, 4, 3, 1, 1, 1]</pre>
 
=={{header|Delphi}}==
{{trans|C}}
<langsyntaxhighlight lang="d">program BeadSortTest;
 
{$APPTYPE CONSOLE}
Line 227 ⟶ 1,114:
 
readln;
end.</langsyntaxhighlight>
--[[User:Davidizadar|DavidIzadaR]] 18:12, 7 August 2011 (UTC)
 
=={{header|D}}==
A functional-style solution.
<lang d>import std.stdio, std.algorithm, std.range, std.array, std.functional;
 
alias repeat0 = curry!(repeat, 0);
 
// Currenty std.range.transposed doesn't work.
auto columns(R)(R m) /*pure nothrow*/ {
return m
.map!walkLength
.reduce!max
.iota
.map!(i => m.filter!(s => s.length > i).walkLength.repeat0);
}
 
auto beadSort(in uint[] data) /*pure nothrow*/ {
return data.map!repeat0.columns.columns.map!walkLength;
}
 
void main() {
[5, 3, 1, 7, 4, 1, 1].beadSort.writeln;
}</lang>
{{out}}
<pre>[7, 5, 4, 3, 1, 1, 1]</pre>
=={{header|Eiffel}}==
<syntaxhighlight lang="eiffel">
<lang Eiffel>
class
BEAD_SORT
 
feature
 
bead_sort (ar: ARRAY [INTEGER]): ARRAY [INTEGER]
-- Sorted array in descending order.
require
only_positive_integers: across ar as a all a.item > 0 end
local
max, count, i, j, k: INTEGER
sorted: ARRAY[INTEGER]
do
max := max_item (ar)
create sortedResult.make_filled (0, 1, ar.count)
from
i := 1
until
i > max
loop
count := 0
from
k := 1
until
k > ar.count
loop
if ar.item (k) >= i then
count := count + 1
end
k := k + 1
end
from
j := 1
until
j > count
loop
sortedResult [j] := i
j := j + 1
end
i := i + 1
end
ensure
RESULT:= sorted
array_is_sorted: is_sorted (Result)
end
end
 
feature {NONE}
 
max_item(ar: ARRAY [INTEGER]):INTEGER
max_item (ar: ARRAY [INTEGER]): INTEGER
require
-- Max item of 'ar'.
ar_not_void: ar/= Void
require
local
ar_not_void: ar /= Void
i, max: INTEGER
do
do
across
from
ar as a
i:=1
loop
until
if a.item > Result then
i > ar.count
Result := a.item
loop
end
if ar.item(i) > max then
end
max := ar.item(i)
end
i := i + 1
end
Result := max
ensure
Result_is_max: across ar as a all a.item <= Result end
result_is_set: Result /= Void
end
end
 
is_sorted (ar: ARRAY [INTEGER]): BOOLEAN
end
--- Is 'ar' sorted in descending order?
require
ar_not_empty: ar.is_empty = False
local
i: INTEGER
do
Result := True
from
i := ar.lower
until
i = ar.upper
loop
if ar [i] < ar [i + 1] then
Result := False
end
i := i + 1
end
end
 
end
</lang>
</syntaxhighlight>
Test:
<syntaxhighlight lang="eiffel">
<lang Eiffel>
 
class
APPLICATION
inherit
ARGUMENTS
create
make
feature
make
make
do
do
test:= <<1, 5, 99, 2, 95, 7, 7>>
test := <<1, 5, 99, 2, 95, 7, 7>>
create beadsort
create beadsort
io.put_string ("unsorted:"+"%N")
across test as ar loop io.put_string (ar.item.out"unsorted:" + "%TN") end
across
io.put_string ("%N"+"sorted:"+"%N")
test as ar
across beadsort.bead_sort (test) as ar loop io.put_string(ar.item.out + "%T") end
loop
end
io.put_string (ar.item.out + "%T")
beadsort: BEAD_SORT
end
io.put_string ("%N" + "sorted:" + "%N")
test := beadsort.bead_sort (test)
across
test as ar
loop
io.put_string (ar.item.out + "%T")
end
end
beadsort: BEAD_SORT
test: ARRAY [INTEGER]
end
 
</lang>
</syntaxhighlight>
{{out}}
<pre>
Line 348 ⟶ 1,246:
sorted:
99 95 7 7 5 2 1
</pre>
 
=={{header|Elixir}}==
{{trans|Erlang}}
<syntaxhighlight lang="elixir">defmodule Sort do
def bead_sort(list) when is_list(list), do: dist(dist(list))
defp dist(list), do: List.foldl(list, [], fn(n, acc) when n>0 -> dist(acc, n, []) end)
defp dist([], 0, acc), do: Enum.reverse(acc)
defp dist([h|t], 0, acc), do: dist(t, 0, [h |acc])
defp dist([], n, acc), do: dist([], n-1, [1 |acc])
defp dist([h|t], n, acc), do: dist(t, n-1, [h+1|acc])
end</syntaxhighlight>
 
Example:
<pre>
iex(20)> Sort.bead_sort([5,3,9,4,1,6,8,2,7])
[9, 8, 7, 6, 5, 4, 3, 2, 1]
</pre>
 
=={{header|Erlang}}==
<langsyntaxhighlight lang="erlang">-module(beadsort).
 
-export([sort/1]).
Line 368 ⟶ 1,285:
dist(T, 0, [H | Acc]);
dist([], 0, Acc) ->
lists:reverse(Acc).</langsyntaxhighlight>
Example;
<langsyntaxhighlight lang="erlang">1> beadsort:sort([1,734,24,3,324,324,32,432,42,3,4,1,1]).
[734,432,324,324,42,32,24,4,3,3,1,1,1]</langsyntaxhighlight>
 
=={{header|F_Sharp|F#}}==
{{trans|Haskell}}
<langsyntaxhighlight lang="fsharp">open System
 
let removeEmptyLists lists = lists |> List.filter (not << List.isEmpty)
Line 388 ⟶ 1,305:
 
// Using the forward composition operator ">>" ...
let beadSort2 = List.map (flip List.replicate 1) >> transpose >> transpose >> List.map List.sum</langsyntaxhighlight>
Usage: beadSort [2;4;1;3;3] or beadSort2 [2;4;1;3;3]
 
{{out}}
Output:
<pre>
val it : int list = [4; 3; 3; 2; 1]
Line 397 ⟶ 1,314:
 
=={{header|Factor}}==
<langsyntaxhighlight lang="factor">USING: kernel math math.order math.vectors sequences ;
: fill ( seq len -- newseq ) [ dup length ] dip swap - 0 <repetition> append ;
 
Line 405 ⟶ 1,322:
[ ] [ v+ ] map-reduce ;
 
: beadsort ( seq -- newseq ) bead bead ;</langsyntaxhighlight>
<langsyntaxhighlight lang="factor">( scratchpad ) { 5 2 4 1 3 3 9 } beadsort .
{ 9 5 4 3 3 2 1 }</langsyntaxhighlight>
 
=={{header|Fortran}}==
Line 420 ⟶ 1,337:
very same code would run fine even with large integers.
 
<langsyntaxhighlight lang="fortran">program BeadSortTest
use iso_fortran_env
! for ERROR_UNIT; to make this a F95 code,
Line 460 ⟶ 1,377:
end subroutine beadsort
 
end program BeadSortTest</langsyntaxhighlight>
 
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="freebasic">#define MAXNUM 100
 
Sub beadSort(bs() As Long)
Dim As Long i, j = 1, lb = Lbound(bs), ub = Ubound(bs)
Dim As Long poles(MAXNUM)
For i = 1 To ub
For j = 1 To bs(i)
poles(j) += 1
Next j
Next i
For j = 1 To ub
bs(j) = 0
Next j
For i = 1 To Ubound(poles)
For j = 1 To poles(i)
bs(j) += 1
Next j
Next i
End Sub
 
'--- Programa Principal ---
Dim As Long i
Dim As Ulong array(1 To 8) => {5, 3, 1, 7, 4, 1, 1, 20}
Dim As Long a = Lbound(array), b = Ubound(array)
 
Randomize Timer
 
Print "unsort ";
For i = a To b : Print Using "####"; array(i); : Next i
 
beadSort(array())
 
Print !"\n sort ";
For i = a To b : Print Using "####"; array(i); : Next i
 
Print !"\n--- terminado, pulsa RETURN---"
Sleep</syntaxhighlight>
{{out}}
<pre>unsort 5 3 1 7 4 1 1 20
sort 20 7 5 4 3 1 1 1</pre>
 
=={{header|Go}}==
Sorts non-negative integers only. The extension to negative values seemed a distraction from this fun task.
<langsyntaxhighlight lang="go">package main
 
import (
Line 537 ⟶ 1,498:
a[len(a)-1-row] = x
}
}</langsyntaxhighlight>
 
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">def beadSort = { list ->
final nPoles = list.max()
list.collect {
Line 552 ⟶ 1,513:
beadTally.findAll{ it }.size()
}
}</langsyntaxhighlight>
 
Annotated Solution (same solution really):
<langsyntaxhighlight lang="groovy">def beadSortVerbose = { list ->
final nPoles = list.max()
// each row is a number tally-arrayed across the abacus
Line 573 ⟶ 1,534:
def beadTalliesDrop = abacusPolesDrop.transpose()
beadTalliesDrop.collect{ beadTally -> beadTally.findAll{ it }.size() }
}</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang="groovy">println beadSort([23,76,99,58,97,57,35,89,51,38,95,92,24,46,31,24,14,12,57,78,4])
println beadSort([88,18,31,44,4,0,8,81,14,78,20,76,84,33,73,75,82,5,62,70,12,7,1])</langsyntaxhighlight>
 
{{out}}
Output:
<pre>........................................................................................................................[4, 12, 14, 23, 24, 24, 31, 35, 38, 46, 51, 57, 57, 58, 76, 78, 89, 92, 95, 97, 99]
...............................................................................................................[0, 1, 4, 5, 7, 8, 12, 14, 18, 20, 31, 33, 44, 62, 70, 73, 75, 76, 78, 81, 82, 84, 88]</pre>
Line 588 ⟶ 1,549:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import Data.List
 
beadSort :: [Int] -> [Int]
beadSort = map sum. transpose. transpose. map (flip replicate 1)</langsyntaxhighlight>
Example;
<langsyntaxhighlight lang="haskell">*Main> beadSort [2,4,1,3,3]
[4,3,3,2,1]</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
The program below handles integers and not just whole numbers. As are so many others, the solution is limited by the lack of sparse array or list compression.
 
<langsyntaxhighlight Iconlang="icon">procedure main() #: demonstrate various ways to sort a list and string
write("Sorting Demo using ",image(beadsort))
writes(" on list : ")
Line 623 ⟶ 1,584:
}
return X
end</langsyntaxhighlight>
 
Note: This example relies on [[Sorting_algorithms/Bubble_sort#Icon| the supporting procedures 'writex' in Bubble Sort]].
Note: min and max are available in the Icon Programming Library (IPL).
 
{{out|Abbreviated sample output}}
 
Abbreviated sample output:<pre>Sorting Demo using procedure beadsort
on list : [ 3 14 1 5 9 2 6 3 ]
with op = &null: [ 1 2 3 3 5 6 9 14 ] (0 ms)</pre>
Line 637 ⟶ 1,598:
{{eff note|J|\:~}}
 
<langsyntaxhighlight lang="j">bead=: [: +/ #"0&1</langsyntaxhighlight>
 
Example use:
 
<syntaxhighlight lang="text"> bead bead 2 4 1 3 3
4 3 3 2 1
bead bead 5 3 1 7 4 1 1
7 5 4 3 1 1 1</langsyntaxhighlight>
 
Extending to deal with sequences of arbitrary integers:
 
<langsyntaxhighlight lang="j">bball=: ] (] + [: bead^:2 -) <./ - 1:</langsyntaxhighlight>
 
Example use:
 
<syntaxhighlight lang="text"> bball 2 0 _1 3 1 _2 _3 0
3 2 1 0 0 _1 _2 _3</langsyntaxhighlight>
 
=={{header|Java}}==
 
<syntaxhighlight lang="java">
<lang Java>
 
public class BeadSort
Line 676 ⟶ 1,637:
int[] beadSort(int[] arr)
{
int max=a[0];
for(int i=01;i<arr.length;i++)
if(arr[i]>max)
max=arr[i];
Line 739 ⟶ 1,700:
}
}
</syntaxhighlight>
</lang>
{{out}}
Output:
<pre>
Unsorted: 9 4 7 0 4 3 0 5 3 8 7 9 8 7 0
Line 763 ⟶ 1,724:
</pre>
 
=={{header|Mathematicajq}}==
'''Part 1: The abacus'''
<lang Mathematica>beadsort[ a ] := Module[ { m, sorted, s ,t },
This implementation uses an "abacus" as described in the Wikipedia article.
However, rather than representing each row as a set of n beads, it suffices
to use the integer n instead. Thus the initial state of our abacus
is simply the array of numbers to be sorted. (A better approach would be to normalize the integers by subtracting their minimum value minus 1; that would also allow sorting arrays of integers without restriction.)
 
'''Part 2: Gravity'''
<syntaxhighlight lang="jq"># ncols is the number of columns (i.e. vertical poles)
def column_sums(ncols):
. as $abacus
| reduce range(0; ncols) as $col
([];
. + [reduce $abacus[] as $row
(0; if $row > $col then .+1 else . end)]) ;</syntaxhighlight>
'''Part 3: read the answer in order of largest-to-smallest'''
<syntaxhighlight lang="jq"># Generic function to count the number of items in a stream:
def count(stream): reduce stream as $i (0; .+1);
 
def readout:
. as $sums
| .[0] as $n
| reduce range(0;$n) as $i
([]; . + [count( $sums[] | select( . > $i) )]);</syntaxhighlight>
'''"Bead Sort":'''
<syntaxhighlight lang="jq">def bead_sort: column_sums(max) | readout;</syntaxhighlight>
 
'''Example:'''
<syntaxhighlight lang="jq">[734,3,1,24,324,324,32,432,42,3,4,1,1] | bead_sort</syntaxhighlight>
{{out}}
<syntaxhighlight lang="sh">$ jq -n -c -f bead_sort.jq
[734,432,324,324,42,32,24,4,3,3,1,1,1]</syntaxhighlight>
 
=={{header|Julia}}==
{{works with|Julia|0.6}}
Implement <code>beadsort</code> on a <code>BitArray</code> ''abacus''. The function should work for any integer type. It throws a <code>DomainError</code> if the input array contains a non-positive integer.
<syntaxhighlight lang="julia">function beadsort(a::Vector{<:Integer})
lo, hi = extrema(a)
if lo < 1 throw(DomainError()) end
len = length(a)
abacus = falses(len, hi)
for (i, v) in enumerate(a)
abacus[i, 1:v] = true
end
for i in 1:hi
v = sum(abacus[:, i])
if v < len
abacus[1:end-v, i] = false
abacus[end-v+1:end, i] = true
end
end
return collect(eltype(a), sum(abacus[i,:]) for i in 1:len)
end
 
v = rand(UInt8, 20)
println("# unsorted bytes: $v\n -> sorted bytes: $(beadsort(v))")
v = rand(1:2 ^ 10, 20)
println("# unsorted integers: $v\n -> sorted integers: $(beadsort(v))")</syntaxhighlight>
 
{{out}}
<pre># unsorted bytes: UInt8[0xff, 0x52, 0xdd, 0x72, 0xe2, 0x13, 0xb5, 0xd3, 0x7f, 0xea, 0x3b, 0x46, 0x4b, 0x78, 0xfb, 0xbe, 0xd8, 0x2e, 0xa9, 0x7a]
-> sorted bytes: UInt8[0x13, 0x2e, 0x3b, 0x46, 0x4b, 0x52, 0x72, 0x78, 0x7a, 0x7f, 0xa9, 0xb5, 0xbe, 0xd3, 0xd8, 0xdd, 0xe2, 0xea, 0xfb, 0xff]
# unsorted integers: [1012, 861, 798, 949, 481, 889, 78, 699, 718, 195, 426, 922, 762, 360, 1017, 208, 304, 13, 910, 854]
-> sorted integers: [13, 78, 195, 208, 304, 360, 426, 481, 699, 718, 762, 798, 854, 861, 889, 910, 922, 949, 1012, 1017]</pre>
 
=={{header|Kotlin}}==
{{trans|C}}
<syntaxhighlight lang="scala">// version 1.1.2
 
fun beadSort(a: IntArray) {
val n = a.size
if (n < 2) return
var max = a.max()!!
val beads = ByteArray(max * n)
/* mark the beads */
for (i in 0 until n)
for (j in 0 until a[i])
beads[i * max + j] = 1
 
for (j in 0 until max) {
/* count how many beads are on each post */
var sum = 0
for (i in 0 until n) {
sum += beads[i * max + j]
beads[i * max + j] = 0
}
/* mark bottom sum beads */
for (i in n - sum until n) beads[i * max + j] = 1
}
 
for (i in 0 until n) {
var j = 0
while (j < max && beads[i * max + j] == 1.toByte()) j++
a[i] = j
}
}
 
fun main(args: Array<String>) {
val a = intArrayOf(5, 3, 1, 7, 4, 1, 1, 20)
println("Before sorting : ${a.contentToString()}")
beadSort(a)
println("After sorting : ${a.contentToString()}")
}</syntaxhighlight>
 
{{out}}
<pre>
Before sorting : [5, 3, 1, 7, 4, 1, 1, 20]
After sorting : [1, 1, 1, 3, 4, 5, 7, 20]
</pre>
 
=={{header|Lua}}==
<syntaxhighlight lang="lua">-- Display message followed by all values of a table in one line
function show (msg, t)
io.write(msg .. ":\t")
for _, v in pairs(t) do io.write(v .. " ") end
print()
end
 
-- Return a table of random numbers
function randList (length, lo, hi)
local t = {}
for i = 1, length do table.insert(t, math.random(lo, hi)) end
return t
end
 
-- Count instances of numbers that appear in counting to each list value
function tally (list)
local tal = {}
for k, v in pairs(list) do
for i = 1, v do
if tal[i] then tal[i] = tal[i] + 1 else tal[i] = 1 end
end
end
return tal
end
 
-- Sort a table of positive integers into descending order
function beadSort (numList)
show("Before sort", numList)
local abacus = tally(numList)
show("Tally list", abacus)
local sorted = tally(abacus)
show("After sort", sorted)
end
 
-- Main procedure
math.randomseed(os.time())
beadSort(randList(10, 1, 10))</syntaxhighlight>
{{out}}
<pre>Before sort: 9 5 3 9 4 1 3 8 1 2
Tally list: 10 8 7 5 4 3 3 3 2
After sort: 9 9 8 5 4 3 3 2 1 1</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">beadsort[ a ] := Module[ { m, sorted, s ,t },
sorted = a; m = Max[a]; t=ConstantArray[0, {m,m} ];
If[ Min[a] < 0, Print["can't sort"]];
For[ i = 1, i < Length[a], i++, t[[i,1;;a[[i]]]]=1 ]
 
For[ i = 1 ,i <= m, i++, s = Total[t[[;;,i]]];
t[[ ;; , i]] = 0; t[[1 ;; s , i]] = 1; ]
 
For[ i=1,i<=Length[a],i++, sorted[[i]] = Total[t[[i,;;]]]; ]
Print[sorted];
]
]</lang>
beadsort[{2,1,5,3,6}]</syntaxhighlight>
 
{{out}}
<pre>beadsort[{2,1,5,3,6}]
-<pre>{6,3,2,1,0}</pre>
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
 
Line 829 ⟶ 1,940:
end vv
return '['list.space(1, ',')']'
</syntaxhighlight>
</lang>
{{out}}
'''Output:'''
<pre>
[734,3,1,24,324,-1024,-666,-1,0,324,32,0,432,42,3,4,1,1]
Line 836 ⟶ 1,947:
</pre>
 
=={{header|NimrodNim}}==
<langsyntaxhighlight nimrodlang="nim">proc beadSort[T](a: var openarray[T]) =
var max = low(T)
var sum = 0
Line 846 ⟶ 1,957:
var beads = newSeq[int](max * a.len)
 
for i in 0 .. < a.len:
for j in 0 .. < a[i]:
beads[i * max + j] = 1
 
for j in 0 .. < max:
sum = 0
for i in 0 .. < a.len:
sum += beads[i * max + j]
beads[i * max + j] = 0
 
for i in a.len - sum .. < a.len:
beads[i * max + j] = 1
 
for i in 0 .. < a.len:
var j = 0
while j < max and beads[i * max + j] > 0: inc j
Line 866 ⟶ 1,977:
var a = @[5, 3, 1, 7, 4, 1, 1, 20]
beadSort a
echo a</langsyntaxhighlight>
{{out}}
Output:
<pre>@[1, 1, 1, 3, 4, 5, 7, 20]</pre>
 
=={{header|OCaml}}==
{{trans|Haskell}}
<langsyntaxhighlight lang="ocaml">let rec columns l =
match List.filter ((<>) []) l with
[] -> []
Line 880 ⟶ 1,991:
 
let bead_sort l =
List.map List.length (columns (columns (List.map (fun e -> replicate e 1) l)))</langsyntaxhighlight>
usage
<pre>
Line 889 ⟶ 2,000:
=={{header|Octave}}==
{{trans|Fortran}}
<langsyntaxhighlight lang="octave">function sorted = beadsort(a)
sorted = a;
m = max(a);
Line 909 ⟶ 2,020:
endfunction
 
beadsort([5, 7, 1, 3, 1, 1, 20])</langsyntaxhighlight>
 
=={{header|ooRexx}}==
===version 1===
<syntaxhighlight lang="oorexx">in='10 -12 1 0 999 8 2 2 4 4'
Do i=1 To words(in)
z.i=word(in,i)
End
n=i-1
init=0
Call minmax
 
beads.=0;
Do i=1 To words(in)
z=z.i
beads.z+=1
End
j=0
Do i=lo To hi
Do While beads.i>0
j+=1
s.j=i
beads.i-=1
End;
End;
Call show ' Input:',z.,n
Call show 'Sorted:',s.,n
Exit
 
minmax:
Do i=1 To n
If init=0 Then Do
init=1
lo=z.i
hi=z.i
End
Else Do
lo=min(lo,z.i)
hi=max(hi,z.i)
End
End
Return
 
show: Procedure Expose n
Use Arg txt,a.
ol=txtg>
Do i=1 To n
ol=ol format(a.i,3)
End
Say ol
Return </syntaxhighlight>
{{out}}
<pre> Input: 10 -12 1 0 999 8 2 2 4 4
Sorted: -12 0 1 2 2 4 4 8 10 999</pre>
 
===version 2===
{{trans|REXX}}
'''Note:''' The only changes needed were to substitute '''<tt>_</tt>''', '''<tt>!</tt>''' and '''<tt>?</tt>''' characters for the &quot;deprecated&quot; <tt>'''$'''</tt>, <tt>'''#'''</tt> and '''<tt>@</tt>''' characters within variable names; as per <cite>The REXX Language, Second Edition</cite> by M. F. Cowlishaw. (See a description [http://www.rexxla.org/rexxlang/mfc/trl.html here]).
<langsyntaxhighlight ooRexxlang="oorexx">/*REXX program sorts a list of integers using a bead sort. */
 
/*get some grassHopper numbers. */
Line 996 ⟶ 2,160:
say copies('─',80) /*show a separator line. */
return
</syntaxhighlight>
</lang>
 
{{out}}
'''output'''
<pre style="height:30ex;overflow:scroll">
element 1 before sort: 1
Line 1,206 ⟶ 2,370:
=={{header|OpenEdge/Progress}}==
Sorting algorithms are not the kind of thing you need / want to do in OpenEdge. If you want to sort simply define a temp-table with one field, populate it and get sorted results with FOR EACH temp-table DESCENDING.
<langsyntaxhighlight lang="openedge/progress">FUNCTION beadSort RETURNS CHAR (
i_c AS CHAR
):
Line 1,256 ⟶ 2,420:
"5,3,1,7,4,1,1 -> " beadSort( "5,3,1,7,4,1,1" ) SKIP(1)
beadSort( "88,18,31,44,4,0,8,81,14,78,20,76,84,33,73,75,82,5,62,70,12,7,1" )
VIEW-AS ALERT-BOX.</langsyntaxhighlight>
{{out}}
Output:
<pre>---------------------------
Message
Line 1,271 ⟶ 2,435:
=={{header|PARI/GP}}==
This implementation uses the counting sort to order the beads in a given row.
<langsyntaxhighlight lang="parigp">beadsort(v)={
my(sz=vecmax(v),M=matrix(#v,sz,i,j,v[i]>=j)); \\ Set up beads
for(i=1,sz,M[,i]=countingSort(M[,i],0,1)~); \\ Let them fall
Line 1,294 ⟶ 2,458:
);
left
};</langsyntaxhighlight>
 
=={{header|Pascal}}==
<syntaxhighlight lang="pascal">
See [[Sorting_algorithms/Bead_sort#Delphi | Delphi]]
program BDS;
const MAX = 1000;
type
type_matrix = record
lin,col:integer;
matrix: array [1..MAX,1..MAX] of boolean;
end;
 
type_vector = record
size:integer;
vector: array[1..MAX] of integer;
end;
 
procedure BeadSort(var v:type_vector);
var
i,j,k,sum:integer;
m:type_matrix;
begin
m.lin:=v.size;
 
(* the number of columns is equal to the greatest element *)
m.col:=0;
for i:=1 to v.size do
if v.vector[i] > m.col then
m.col:=v.vector[i];
 
(* initializing the matrix *)
for j:=1 to m.lin do
begin
k:=1;
for i:=m.col downto 1 do
begin
if v.vector[j] >= k then
m.matrix[i,j]:=TRUE
else
m.matrix[i,j]:=FALSE;
k:=k+1;
end;
end;
 
(* Sort the matrix *)
for i:=1 to m.col do
begin
(* Count the beads and set the line equal FALSE *)
sum:=0;
for j:=1 to m.lin do
begin
if m.matrix[i,j] then
sum:=sum+1;
m.matrix[i,j]:=FALSE;
end;
 
(* The line receives the bead sorted *)
for j:=m.lin downto m.lin-sum+1 do
m.matrix[i,j]:=TRUE;
end;
 
(* Convert the sorted bead matrix to a sorted vector *)
for j:=1 to m.lin do
begin
v.vector[j]:=0;
i:=m.col;
while (m.matrix[i,j] = TRUE)and(i>=1) do
begin
v.vector[j]+=1;
i:=i-1;
end;
end;
end;
 
procedure print_vector(var v:type_vector);
var i:integer;
begin
for i:=1 to v.size do
write(v.vector[i],' ');
writeln;
end;
 
var
i:integer;
v:type_vector;
begin
writeln('How many numbers do you want to sort?');
readln(v.size);
writeln('Write the numbers:');
 
for i:=1 to v.size do
read(v.vector[i]);
 
writeln('Before sort:');
print_vector(v);
 
BeadSort(v);
 
writeln('After sort:');
print_vector(v);
end.
 
</syntaxhighlight>
 
{{out}}
<pre>
How many numbers do you want to sort?
10
Write the numbers:
23 13 99 45 26 7 63 214 87 45
Before sort:
23 13 99 45 26 7 63 214 87 45
After sort:
7 13 23 26 45 45 63 87 99 214
</pre>
 
=={{header|Perl}}==
Instead of storing the bead matrix explicitly, I choose to store just the number of beads in each row and column, compacting on the fly. At all times, the sum of the row widths is equal to the sum column heights.
 
<langsyntaxhighlight lang="perl">sub beadsort {
my @data = @_;
 
Line 1,318 ⟶ 2,593:
 
beadsort 5, 7, 1, 3, 1, 1, 20;
</syntaxhighlight>
</lang>
 
=={{header|Perl 6Phix}}==
<!--<syntaxhighlight lang="phix">(phixonline)-->
{{trans|Haskell}}
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<lang perl6>use List::Utils;
 
<span style="color: #008080;">function</span> <span style="color: #000000;">beadsort</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">a</span><span style="color: #0000FF;">)</span>
sub beadsort(@l) {
<span style="color: #004080;">sequence</span> <span style="color: #000000;">poles</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">))</span>
(transpose(transpose(map {[1 xx $_]}, @l))).map(*.elems);
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
}
<span style="color: #000000;">poles</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">poles</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">a</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: #008080;">end</span> <span style="color: #008080;">for</span>
my @list = 2,1,3,5;
<span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$]</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">0</span>
say beadsort(@list).perl;</lang>
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">poles</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
 
<span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">poles</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]]</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sq_add</span><span style="color: #0000FF;">(</span><span style="color: #000000;">a</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..</span><span style="color: #000000;">poles</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>
Output:
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<pre>(5, 3, 2, 1)</pre>
<span style="color: #008080;">return</span> <span style="color: #000000;">a</span>
Here we simulate the dropping beads by using the <tt>push</tt> method.
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
<lang perl6>sub beadsort(*@list) {
my @rods;
<span style="color: #0000FF;">?</span><span style="color: #000000;">beadsort</span><span style="color: #0000FF;">({</span><span style="color: #000000;">5</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">3</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">7</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">4</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">20</span><span style="color: #0000FF;">})</span>
for ^«@list -> $x { @rods[$x].push(1) }
<!--</syntaxhighlight>-->
gather for ^@rods[0] -> $y {
{{out}}
take [+] @rods.map: { .[$y] // last }
<pre>
}
{20,7,5,4,3,1,1,1}
}
</pre>
 
say beadsort 2,1,3,5;</lang>
The <tt>^</tt> is the "upto" operator that gives a range of 0 up to (but not including) its endpoint. We use it as a hyperoperator (<tt>^«</tt>) to generate all the ranges of rod numbers we should drop a bead on, with the result that <tt>$x</tt> tells us which rod to drop each bead on. Then we use <tt>^</tt> again on the first rod to see how deep the beads are stacked, since they are guaranteed to be the deepest there. The <tt>[+]</tt> adds up all the beads that are found at level <tt>$y</tt>. The <tt>last</tt> short circuits the map so we don't have to look for all the missing beads at a given level, since the missing beads are all guaranteed to come after the existing beads at that level (because we always dropped left to right starting at rod 0).
 
=={{header|PHP}}==
{{trans|Haskell}}
<langsyntaxhighlight lang="php"><?php
function columns($arr) {
if (count($marr) == 0)
return array();
else if (count($marr) == 1)
return array_chunk($marr[0], 1);
 
array_unshift($arr, NULL);
Line 1,367 ⟶ 2,640:
 
print_r(beadsort(array(5,3,1,7,4,1,1)));
?></langsyntaxhighlight>
 
{{out}}
Output:
<pre>Array
(
Line 1,384 ⟶ 2,657:
The following implements a direct model of the bead sort algorithm.
Each pole is a list of 'T' symbols for the beads.
<langsyntaxhighlight PicoLisplang="picolisp">(de beadSort (Lst)
(let Abacus (cons NIL)
(for N Lst # Thread beads on poles
Line 1,392 ⟶ 2,665:
(make
(while (gt0 (cnt pop (cdr Abacus))) # Drop and count beads
(link @) ) ) ) )</langsyntaxhighlight>
{{out}}
Output:
<pre>: (beadSort (5 3 1 7 4 1 1 20))
-> (20 7 5 4 3 1 1 1)</pre>
 
=={{header|PL/I}}==
===version 1===
<lang PL/I>
<syntaxhighlight lang="pl/i">
/* Handles both negative and positive values. */
 
Line 1,471 ⟶ 2,745:
if offset < 0 then z = a + offset; else z = a;
 
end beadsort;</langsyntaxhighlight>
 
===version 2===
{{trans|ooRexx}}
PL/I supports negative array indices!
<syntaxhighlight lang="pli">*process source attributes xref;
/* Handles both negative and positive values. */
Beadsort: Proc Options(main);
Dcl sysprint Print;
Dcl (hbound,max,min) Builtin;
 
Dcl z(10) Bin Fixed(31) Init(10,-12,1,0,999,8,2,2,4,4);
Dcl s(10) Bin Fixed(31);
Dcl (init,lo,hi) Bin Fixed(31) Init(0);
Dcl (i,j) Bin Fixed(31) Init(0);
 
Call minmax(z,init,lo,hi);
 
Begin;
Dcl beads(lo:hi) Bin Fixed(31);
beads=0;
Do i=1 To hbound(z);
beads(z(i))+=1;
End;
Do i=lo To hi;
Do While(beads(i)>0);
j+=1;
s(j)=i;
beads(i)-=1;
End;
End;
Put Edit(' Input:',(z(i) Do i=1 To hbound(z)))(skip,a,99(f(4)));
Put Edit('Sorted:',(s(i) Do i=1 To hbound(s)))(skip,a,99(f(4)));
End;
 
minmax: Proc(z,init,lo,hi);
Dcl z(*) Bin Fixed(31);
Dcl (init,lo,hi) Bin Fixed(31);
Do i=1 To hbound(z);
If init=0 Then Do;
init=1;
lo,hi=z(i);
End;
Else Do;
lo=min(lo,z(i));
hi=max(hi,z(i));
End;
End;
End;
 
End;</syntaxhighlight>
{{out}}
<pre> Input: 10 -12 1 0 999 8 2 2 4 4
Sorted: -12 0 1 2 2 4 4 8 10 999</pre>
 
=={{header|PowerShell}}==
<langsyntaxhighlight PowerShelllang="powershell">Function BeadSort ( [Int64[]] $indata )
{
if( $indata.length -gt 1 )
Line 1,513 ⟶ 2,840:
}
 
$l = 100; BeadSort ( 1..$l | ForEach-Object { $Rand = New-Object Random }{ $Rand.Next( -( $l - 1 ), $l - 1 ) } )</langsyntaxhighlight>
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">#MAXNUM=100
 
Dim MyData(Random(15)+5)
Line 1,587 ⟶ 2,914:
Next
PrintN(#CRLF$+"And its sum= "+Str(sum))
EndProcedure</langsyntaxhighlight>
<pre>
The array is;
Line 1,598 ⟶ 2,925:
 
=={{header|Python}}==
<syntaxhighlight lang="python">
{{trans|Haskell}}
#!/bin/python3
<lang python>try:
from itertools import zip_longest
except:
try:
from itertools import izip_longest as zip_longest
except:
zip_longest = lambda *args: map(None, *args)
 
# This is wrong, it works only on specific examples
def beadsort(l):
return list(map(lensum, columns(columnszip_longest(*[[1] * e for e in l], fillvalue=0)))
 
def columns(l):
return [filter(None, x) for x in zip_longest(*l)]
 
# Demonstration code:
print(beadsort([5,3,1,7,4,1,1]))</lang>
</syntaxhighlight>
 
{{out}}
Output:
<pre>[7, 5, 4, 3, 1, 1, 1]</pre>
 
=={{header|QB64}}==
<syntaxhighlight lang="qb64">
#lang QB64
'***************************************************
'* BeadSort is VERY fast for small CGSortLibArray(max)-CGSortLibArray(min). Typical performance is
'* O(NlogN) or better. However as the key values (array values and ranges) go up, the performance
'* drops steeply excellent for small-ranged arrays. Integer only at this point. Throughput is
'* roughly 900k/GHzS for double-precision, with binary range (0,1). Related to CountingSort()
'***************************************************
SUB BeadSort (CGSortLibArray() AS DOUBLE, start AS LONG, finish AS LONG, order&)
DIM MAX AS DOUBLE: MAX = CGSortLibArray(start)
DIM BeadSort_Sum AS DOUBLE
DIM BeadSort_I AS LONG
DIM BeadSort_J AS LONG
FOR BeadSort_I = start + 1 TO (finish - start)
IF (CGSortLibArray(BeadSort_I) > MAX) THEN MAX = CGSortLibArray(BeadSort_I)
NEXT
REDIM beads((finish - start), MAX)
FOR BeadSort_I = 0 TO (finish - start) - 1
FOR BeadSort_J = 0 TO CGSortLibArray(BeadSort_I) - 1
beads(BeadSort_I, BeadSort_J) = 1
NEXT
NEXT
IF order& = 1 THEN
FOR BeadSort_J = 0 TO MAX
BeadSort_Sum = 0
FOR BeadSort_I = 0 TO (finish - start)
BeadSort_Sum = BeadSort_Sum + beads(BeadSort_I, BeadSort_J)
beads(BeadSort_I, BeadSort_J) = 0
NEXT
FOR BeadSort_I = (finish - start) - BeadSort_Sum TO (finish - start)
beads(BeadSort_I, BeadSort_J) = 1
NEXT
NEXT
FOR BeadSort_I = 0 TO (finish - start)
BeadSort_J = 0
WHILE BeadSort_J < MAX AND beads(BeadSort_I, BeadSort_J)
BeadSort_J = BeadSort_J + 1
WEND
CGSortLibArray(BeadSort_I) = BeadSort_J
NEXT
ELSE
FOR BeadSort_J = MAX TO 0 STEP -1
BeadSort_Sum = 0
FOR I = 0 TO (finish - start)
BeadSort_Sum = BeadSort_Sum + beads(I, BeadSort_J)
beads(I, BeadSort_J) = 0
NEXT
FOR I = (finish - start) TO (finish - start) - BeadSort_Sum STEP -1
beads(I, BeadSort_J) = 1
NEXT
NEXT
FOR BeadSort_I = 0 TO (finish - start)
BeadSort_J = 0
WHILE BeadSort_J < MAX AND beads(BeadSort_I, BeadSort_J)
BeadSort_J = BeadSort_J + 1
WEND
CGSortLibArray(finish - BeadSort_I) = BeadSort_J
NEXT
END IF
END SUB
</syntaxhighlight>
 
=={{header|Racket}}==
 
{{trans|Haskell}}
<syntaxhighlight lang="racket">
 
<lang racket>
#lang racket
(require rackunit)
Line 1,639 ⟶ 3,022:
(bead-sort '(5 3 1 7 4 1 1))
'(7 5 4 3 1 1 1))
</syntaxhighlight>
</lang>
 
=={{header|REXXRaku}}==
(formerly Perl 6)
The REXX language has the advantage of implenting (true) sparse arrays and with that feature,
{{Works with|rakudo|2016-05}}
<br>implementing a bead sort is trivial, the major drawback is if the spread (difference between
{{trans|Haskell}}
<br>the lowest and highest values) is quite large.
<syntaxhighlight lang="raku" line># routine cribbed from List::Utils;
<br>Negative and duplicate numbers (values) are no problem.
sub transpose(@list is copy) {
<lang rexx>/*REXX program sorts a list of integers using a bead sort algorithm. */
gather {
/*get some grassHopper numbers. */
while @list {
grasshopper=,
my @heads;
1 4 10 12 22 26 30 46 54 62 66 78 94 110 126 134 138 158 162 186 190 222 254 270
if @list[0] !~~ Positional { @heads = @list.shift; }
else { @heads = @list.map({$_.shift unless $_ ~~ []}); }
@list = @list.map({$_ unless $_ ~~ []});
take [@heads];
}
}
}
 
sub beadsort(@l) {
/*GreeenGrocer numbers are also called hexagonal pyramidal */
(transpose(transpose(map {[1 xx $_]}, @l))).map(*.elems);
/* numbers. */
}
greengrocer=,
0 4 16 40 80 140 224 336 480 660 880 1144 1456 1820 2240 2720 3264 3876 4560
 
my @list = 2,1,3,5;
/*get some Bernoulli numerator numbers. */
say beadsort(@list).perl;</syntaxhighlight>
bernN='1 -1 1 0 -1 0 1 0 -1 0 5 0 -691 0 7 0 -3617 0 43867 0 -174611 0 854513'
 
{{out}}
/*Psi is also called the Reduced Totient function, and */
<pre>(5, 3, 2, 1)</pre>
/* is also called Carmichale lambda, or LAMBDA function.*/
Here we simulate the dropping beads by using the <tt>push</tt> method.
psi=,
<syntaxhighlight lang="raku" line>sub beadsort(*@list) {
1 1 2 2 4 2 6 2 6 4 10 2 12 6 4 4 16 6 18 4 6 10 22 2 20 12 18 6 28 4 30 8 10 16
my @rods;
for words ^«@list -> $x { @rods[$x].push(1) }
gather for ^@rods[0] -> $y {
take [+] @rods.map: { .[$y] // last }
}
}
 
say beadsort 2,1,3,5;</syntaxhighlight>
list=grasshopper greengrocer bernN psi /*combine the four lists into one*/
The <tt>^</tt> is the "upto" operator that gives a range of 0 up to (but not including) its endpoint. We use it as a hyperoperator (<tt>^«</tt>) to generate all the ranges of rod numbers we should drop a bead on, with the result that <tt>$x</tt> tells us which rod to drop each bead on. Then we use <tt>^</tt> again on the first rod to see how deep the beads are stacked, since they are guaranteed to be the deepest there. The <tt>[+]</tt> adds up all the beads that are found at level <tt>$y</tt>. The <tt>last</tt> short circuits the map so we don't have to look for all the missing beads at a given level, since the missing beads are all guaranteed to come after the existing beads at that level (because we always dropped left to right starting at rod 0).
 
=={{header|REXX}}==
call showL 'before sort',list /*show the list before sorting. */
The REXX language has the advantage of supporting sparse arrays, so implementing a bead sort is trivial, the
$=beadSort(list) /*invoke the bead sort. */
<br>major drawback is &nbsp; ''if'' &nbsp; the spread &nbsp; (difference between the lowest and highest values) &nbsp; is quite large &nbsp; (if it's
call showL ' after sort',$ /*show the after array elements.*/
<br>greater than a few million), &nbsp; it'll slow up the display &nbsp; (but not the sorting).
exit /*stick a fork in it, we're done.*/
/*──────────────────────────────────SHOW@ subroutine────────────────────*/
beadSort: procedure expose @.; parse arg z
$= /*this'll be the sorted list. */
low=999999999; high=-low /*define the low and high numbers*/
@.=0 /*define all beads to zero. */
 
Zero, negative, and duplicate integers (values) can be handled.
do j=1 until z=='' /*pick the meat off the bone. */
<syntaxhighlight lang="rexx">/*REXX program sorts a list (4 groups) of integers using the bead sort algorithm. */
parse var z x z
/* original source by Gerard Schildberger */
if \datatype(x,'Whole') then do
/* 20230605 Walter Pachl reformatted and refurbished say; say '*** error! ***'; say/
say 'element' j/* "indefine list isn'ttwo numeric:"dozen x grasshopper numbers. */
say /* source ?? */
gHopper=1 4 10 12 22 26 30 46 54 62 66 78 94 110 126 134 138 158 162 186 190 222 exit 13254,
end270
x=x/1 /*normalize number,these are also called hexagonal itpyramidal could#s. be: */
/* see https://oeis.org/A002412 /* +4 007 5. 2e3 etc.*/
greenGrocer=0 4 16 40 80 140 224 336 480 660 880 1144 1456 1820 2240 2720 3264 3876,
@.x=@.x+1 /*indicate this bead has a number*/
4560
low=min(low,x) /*keep track of the lowest number*/
high=max(high,x) /* " " " " highest/* define twenty-three "Bernoulli numerator numbers*/
/* source ?? quotes needed because of negative #s.*/
end /*j*/
bernN='1 -1 1 0 -1 0 1 0 -1 0 5 0 -691 0 7 0 -3617 0 43867 0 -174611 0'
/*now, collect the beads and */
do m=low to high /*let themalso called fallthe (toReduced zero).Totient function, */
if @.m==0 then iterate /*No beadand is also called Carmichael lambda, here? Then keep looking*/
do n=1 for @.m /*let or the beadsLAMBDA function fall to 0. */
$=$ m /*add itsee to the sorted listhttps://en. wikipedia.org/wiki/Carmichael_function */
psi=1 1 2 2 4 2 6 2 6 4 10 2 12 6 4 4 16 6 18 4 6 10 22 2 20 12 18 6 28 4 30 8 10 16
end /*n*/
list=gHopper greenGrocer bernN psi /*combine the four lists into one list.*/
end /*m*/
Call show 'before sort',list /*display the list before sorting. */
 
Say copies('¦', 75) /*show long separator line before sort.*/
return $
Call show ' after sort',beadSort(list) /*display the list after sorting. */
/*──────────────────────────────────SHOWL subroutine────────────────────*/
Exit /*stick a fork in it, we're all done. */
showL: widthH=length(words(arg(2))) /*maximum width of the index. */
/*----------------------------------------------------------------------------------*/
 
beadSort: Procedure
do j=1 for words(arg(2))
Parse Arg list 1 low . 1 high . /* List to be sorted and first value */
say 'element' right(j,widthH) arg(1)":" right(word(arg(2),j),10)
occurences.=0 /* count stem occurences */
end /*j*/
Do Until list=='' /* loop through the list */
 
say copies('─',79) Parse Var list bead list /*show atake an element separator line. */
bead= bead / 1 /* normalize the value */
return</lang>
occurences.bead=occurences.bead + 1 /* bump occurences */
'''output'''
low= min(low, bead) /* track lowest */
<pre style="height:30ex;overflow:scroll">
high=max(high,bead) /* and highest number */
element 1 before sort: 1
End
element 2 before sort: 4
sorted='' /* now, collect the beads */
element 3 before sort: 10
Do v=low To high
element 4 before sort: 12
If occurences.v>0 Then
element 5 before sort: 22
sorted=sorted copies(v' ', occurences.v)
element 6 before sort: 26
End
element 7 before sort: 30
Return sorted
element 8 before sort: 46
/*----------------------------------------------------------------------------------*/
element 9 before sort: 54
show:
element 10 before sort: 62
Parse Arg txt,slist
element 11 before sort: 66
n=words(slist)
element 12 before sort: 78
w=length(n)
element 13 before sort: 94
Do k=1 For n
element 14 before sort: 110
Say right('element',30) right(k,w) txt':' right(word(slist,k),9)
element 15 before sort: 126
End
element 16 before sort: 134
Return</syntaxhighlight>
element 17 before sort: 138
{{out|output|text=&nbsp; when using the default input:}}
element 18 before sort: 158
(Shown at three-quarter size.)
element 19 before sort: 162
<pre style="font-size:75%;height:90ex">
element 20 before sort: 186
element 211 before sort: 190 1
element 222 before sort: 222 4
element 233 before sort: 25410
element 244 before sort: 27012
element 255 before sort: 022
element 266 before sort: 426
element 277 before sort: 1630
element 288 before sort: 4046
element 299 before sort: 8054
element 30 element 10 before sort: 14062
element 31 element 11 before sort: 22466
element 32 element 12 before sort: 33678
element 33 element 13 before sort: 48094
element 34 element 14 before sort: 660110
element 35 element 15 before sort: 880126
element 36 element 16 before sort: 1144134
element 37 element 17 before sort: 1456138
element 38 element 18 before sort: 1820158
element 39 element 19 before sort: 2240162
element 40 element 20 before sort: 2720186
element 41 element 21 before sort: 3264190
element 42 element 22 before sort: 3876222
element 43 element 23 before sort: 4560254
element 24 before sort: 270
element 44 before sort: 1
element 45 element 25 before sort: -10
element 46 element 26 before sort: 14
element 47 element 27 before sort: 016
element 48 element 28 before sort: -140
element 49 element 29 before sort: 080
element 30 before sort: 140
element 50 before sort: 1
element 31 before sort: 224
element 51 before sort: 0
element 52 element 32 before sort: -1336
element 33 before sort: 480
element 53 before sort: 0
element 34 before sort: 660
element 54 before sort: 5
element 35 before sort: 880
element 55 before sort: 0
element 56 element 36 before sort: -6911144
element 37 before sort: 1456
element 57 before sort: 0
element 38 before sort: 1820
element 58 before sort: 7
element 39 before sort: 2240
element 59 before sort: 0
element 60 element 40 before sort: -36172720
element 41 before sort: 3264
element 61 before sort: 0
element 62 element 42 before sort: 438673876
element 43 before sort: 4560
element 63 before sort: 0
element 64 element 44 before sort: -174611 1
element 65 element 45 before sort: 0-1
element 66 element 46 before sort: 854513 1
element 67 element 47 before sort: 10
element 68 element 48 before sort: -1
element 69 element 49 before sort: 20
element 70 element 50 before sort: 21
element 71 element 51 before sort: 40
element 72 element 52 before sort: 2-1
element 73 element 53 before sort: 60
element 74 element 54 before sort: 25
element 75 element 55 before sort: 60
element 56 before sort: -691
element 76 before sort: 4
element 77 element 57 before sort: 100
element 78 element 58 before sort: 27
element 79 element 59 before sort: 120
element 60 before sort: -3617
element 80 before sort: 6
element 81 element 61 before sort: 40
element 62 before sort: 43867
element 82 before sort: 4
element 83 element 63 before sort: 160
element 64 before sort: -174611
element 84 before sort: 6
element 85 element 65 before sort: 180
element 86 element 66 before sort: 41
element 87 element 67 before sort: 61
element 88 element 68 before sort: 102
element 89 element 69 before sort: 222
element 90 element 70 before sort: 24
element 91 element 71 before sort: 202
element 92 element 72 before sort: 126
element 93 element 73 before sort: 182
element 94 element 74 before sort: 6
element 95 element 75 before sort: 284
element 96 element 76 before sort: 410
element 97 element 77 before sort: 302
element 98 element 78 before sort: 812
element 99 element 79 before sort: 106
element 10080 before sort: 164
element 81 before sort: 4
───────────────────────────────────────────────────────────────────────────────
element 1 after element 82 before sort: -174611 16
element 2 after element 83 before sort: -3617 6
element 3 after element 84 before sort: -691 18
element 4 after element 85 before sort: -14
element 5 after element 86 before sort: -16
element 6 after element 87 before sort: -110
element 7 after sort: 0 element 88 before sort: 22
element 8 after element 89 before sort: 02
element 9 after sort: 0 element 90 before sort: 20
element 91 before sort: 12
element 10 after sort: 0
element 92 before sort: 18
element 11 after sort: 0
element 12 after element 93 before sort: 06
element 94 before sort: 28
element 13 after sort: 0
element 14 after element 95 before sort: 04
element 96 before sort: 30
element 15 after sort: 0
element 16 after element 97 before sort: 08
element 98 before sort: 10
element 17 after sort: 0
element 99 before sort: 16
element 18 after sort: 1
░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
element 19 after sort: 1
element 20 after sort: element 1 after sort: -174611
element 2 after sort: -3617
element 21 after sort: 1
element 3 after sort: -691
element 22 after sort: 1
element 234 after sort: -1
element 245 after sort: 2-1
element 256 after sort: 2-1
element 267 after sort: 20
element 278 after sort: 20
element 289 after sort: 20
element 29 element 10 after sort: 20
element 30 element 11 after sort: 40
element 31 element 12 after sort: 40
element 32 element 13 after sort: 40
element 33 element 14 after sort: 40
element 34 element 15 after sort: 40
element 35 element 16 after sort: 40
element 36 element 17 after sort: 40
element 37 element 18 after sort: 41
element 38 element 19 after sort: 51
element 39 element 20 after sort: 61
element 40 element 21 after sort: 61
element 41 element 22 after sort: 61
element 42 element 23 after sort: 61
element 43 element 24 after sort: 62
element 44 element 25 after sort: 62
element 45 element 26 after sort: 72
element 46 element 27 after sort: 82
element 47 element 28 after sort: 102
element 48 element 29 after sort: 102
element 49 element 30 after sort: 104
element 50 element 31 after sort: 104
element 51 element 32 after sort: 124
element 52 element 33 after sort: 124
element 53 element 34 after sort: 124
element 54 element 35 after sort: 164
element 55 element 36 after sort: 164
element 56 element 37 after sort: 164
element 57 element 38 after sort: 185
element 58 element 39 after sort: 186
element 59 element 40 after sort: 206
element 60 element 41 after sort: 226
element 61 element 42 after sort: 226
element 62 element 43 after sort: 266
element 63 element 44 after sort: 286
element 64 element 45 after sort: 307
element 65 element 46 after sort: 308
element 66 element 47 after sort: 4010
element 67 element 48 after sort: 4610
element 68 element 49 after sort: 5410
element 69 element 50 after sort: 6210
element 70 element 51 after sort: 6612
element 71 element 52 after sort: 7812
element 72 element 53 after sort: 8012
element 73 element 54 after sort: 9416
element 74 element 55 after sort: 11016
element 75 element 56 after sort: 12616
element 76 element 57 after sort: 13418
element 77 element 58 after sort: 13818
element 78 element 59 after sort: 14020
element 79 element 60 after sort: 15822
element 80 element 61 after sort: 16222
element 81 element 62 after sort: 18626
element 82 element 63 after sort: 19028
element 83 element 64 after sort: 22230
element 84 element 65 after sort: 22430
element 85 element 66 after sort: 25440
element 86 element 67 after sort: 27046
element 87 element 68 after sort: 33654
element 88 element 69 after sort: 48062
element 89 element 70 after sort: 66066
element 90 element 71 after sort: 88078
element 91 element 72 after sort: 1144 80
element 92 element 73 after sort: 1456 94
element 93 element 74 after sort: 1820110
element 94 element 75 after sort: 2240126
element 95 element 76 after sort: 2720134
element 96 element 77 after sort: 3264138
element 97 element 78 after sort: 3876140
element 98 element 79 after sort: 4560158
element 99 element 80 after sort: 43867 162
element 10081 after sort: 854513 186
element 82 after sort: 190
───────────────────────────────────────────────────────────────────────────────
element 83 after sort: 222
element 84 after sort: 224
element 85 after sort: 254
element 86 after sort: 270
element 87 after sort: 336
element 88 after sort: 480
element 89 after sort: 660
element 90 after sort: 880
element 91 after sort: 1144
element 92 after sort: 1456
element 93 after sort: 1820
element 94 after sort: 2240
element 95 after sort: 2720
element 96 after sort: 3264
element 97 after sort: 3876
element 98 after sort: 4560
element 99 after sort: 43867
</pre>
 
=={{header|Ruby}}==
{{trans|Haskell}}
<langsyntaxhighlight lang="ruby">class Array
def beadsort
map {|e| [1] * e}.columns.columns.map {|e| e.(&:length})
end
def columns
y = length
x = map {|l| l.(&:length}).max
Array.new(x) do |row|
Array.new(y) { |column| self[column][row] }.compact # Remove nils.
Line 1,931 ⟶ 3,339:
 
# Demonstration code:
p [5,3,1,7,4,1,1].beadsort</langsyntaxhighlight>
 
{{out}}
Line 1,937 ⟶ 3,345:
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">$ include "seed7_05.s7i";
 
const proc: beadSort (inout array integer: a) is func
Line 1,958 ⟶ 3,366:
for i range 1 to length(a) do
sum +:= ord(j in beads[i]);
excl(beads[i], j);
end for;
for i range length(a) downto length(a) - sum + 1 to length(a) do
incl(beadsa[i], := j);
end for;
end for;
for i range 1 to length(a) do
for j range 1 to max until j not in beads[i] do
noop;
end for;
a[i] := pred(j);
end for;
end func;
Line 1,975 ⟶ 3,376:
local
var array integer: a is [] (5, 3, 1, 7, 4, 1, 1, 20);
var integer: numn is 0;
begin
beadSort(a);
for numn range a do
write(numn <& " ");
end for;
writeln;
end func;</langsyntaxhighlight>
 
{{out}}
<pre>
1 1 1 3 4 5 7 20
</pre>
 
=={{header|Sidef}}==
{{trans|Perl}}
<syntaxhighlight lang="ruby">func beadsort(arr) {
 
var rows = []
var columns = []
 
for datum in arr {
for column in ^datum {
++(columns[column] := 0)
++(rows[columns[column] - 1] := 0)
}
}
 
rows.reverse
}
 
say beadsort([5,3,1,7,4,1,1])</syntaxhighlight>
 
{{out}}
<pre>
[1, 1, 1, 3, 4, 5, 7]
</pre>
 
=={{header|Standard ML}}==
{{trans|Haskell}}
<langsyntaxhighlight lang="sml">fun columns l =
case List.filter (not o null) l of
[] => []
Line 1,999 ⟶ 3,424:
 
fun bead_sort l =
map length (columns (columns (map (fn e => replicate (e, 1)) l)))</langsyntaxhighlight>
usage
<pre>
Line 2,007 ⟶ 3,432:
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
proc beadsort numList {
Line 2,029 ⟶ 3,454:
 
# Demonstration code
puts [beadsort {5 3 1 7 4 1 1}]</langsyntaxhighlight>
{{out}}
Output:
<pre>7 5 4 3 1 1 1</pre>
 
=={{header|VBA}}==
{{trans|Phix}}<syntaxhighlight lang="vb">Option Base 1
 
Private Function sq_add(arr As Variant, x As Double) As Variant
Dim res() As Variant
ReDim res(UBound(arr))
For i = 1 To UBound(arr)
res(i) = arr(i) + x
Next i
sq_add = res
End Function
 
Private Function beadsort(ByVal a As Variant) As Variant
Dim poles() As Variant
ReDim poles(WorksheetFunction.Max(a))
For i = 1 To UBound(a)
For j = 1 To a(i)
poles(j) = poles(j) + 1
Next j
Next i
For j = 1 To UBound(a)
a(j) = 0
Next j
For i = 1 To UBound(poles)
For j = 1 To poles(i)
a(j) = a(j) + 1
Next j
Next i
beadsort = a
End Function
Public Sub main()
Debug.Print Join(beadsort([{5, 3, 1, 7, 4, 1, 1, 20}]), ", ")
End Sub</syntaxhighlight>{{out}}
<pre>20, 7, 5, 4, 3, 1, 1, 1</pre>
 
=={{header|Wren}}==
A translation of the Python code in the Wikipedia article. Only works properly for lists of non-negative integers.
<syntaxhighlight lang="wren">var beadSort = Fn.new { |a|
var res = []
var max = a.reduce { |acc, i| (i > acc) ? i : acc }
var trans = [0] * max
for (i in a) {
for (n in 0...i) trans[n] = trans[n] + 1
}
for (i in a) {
res.add(trans.count { |n| n > 0 })
for (n in 0...trans.count) trans[n] = trans[n] - 1
}
return res[-1..0] // return in ascending order
}
 
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)")
a = beadSort.call(a)
System.print("After : %(a)")
System.print()
}</syntaxhighlight>
 
{{out}}
<pre>
Before: [4, 65, 2, 31, 0, 99, 2, 83, 782, 1]
After : [0, 1, 2, 2, 4, 31, 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">include c:\cxpl\codes;
 
proc BeadSort(Array, Length); \Sort Array into increasing order
Line 2,060 ⟶ 3,554:
BeadSort(A, 10);
for I:= 0 to 10-1 do [IntOut(0, A(I)); ChOut(0, ^ )];
]</langsyntaxhighlight>
 
{{out}}
Line 2,066 ⟶ 3,560:
0 1 1 2 3 4 5 6 9 25
</pre>
 
=={{header|zkl}}==
{{trans|D}}
<syntaxhighlight lang="zkl">fcn columns(m){ // m is list of lists of zeros/beads, # beads is n, eg (0,0,0)==3
m
.apply("len") // (0,0,0)-->3
.reduce("max") // largest bead stack
.walker() // [0..max]
.apply('wrap(i){ m.filter('wrap(s){ s.len() > i }).len().pump(List,0) });
}
fcn beadSort(data){
data.apply("pump",List,0):columns(_):columns(_).apply("len");
}</syntaxhighlight>
<syntaxhighlight lang="zkl">T(5,3,1,7,4,1,1):beadSort(_).println();
T(4,3,3,2,1):beadSort(_).println();</syntaxhighlight>
{{out}}
<pre>
L(7,5,4,3,1,1,1)
L(4,3,3,2,1)
</pre>
 
 
{{omit from|GUISS}}
9,485

edits