Sorting algorithms/Counting sort: Difference between revisions

m (→‎{{header|Phix}}: added syntax colouring the hard way)
(27 intermediate revisions by 17 users not shown)
Line 6:
 
;Task:
Implement the [[wp:Counting sort|Counting sort]].   This is a way of sorting integers when the minimum and maximum value are known.
 
 
;Pseudocode:
'''function''' ''countingSort''(array, min, max):
count: '''array of''' (max - min + 1) '''elements'''
Line 28:
 
 
'''Note''': &nbsp; we know that, given an array of integers, &nbsp; its maximum and minimum values can be always found; &nbsp; but if we imagine the worst case for an array that can hold up to 32 bit integers, &nbsp; we see that in order to hold the counts, &nbsp; an array of up to '''2<sup>32</sup>''' elements may be needed. &nbsp; I.E.: &nbsp; we need to hold a count value up to '''2<sup>32</sup>-1''', &nbsp; which is a little over 4.2 Gbytes. &nbsp; So the counting sort is more practical when the range is (very) limited, &nbsp; and minimum and maximum values are known &nbsp; ''a priori''. &nbsp; &nbsp; (TheHowever, as a counterexample, &nbsp; the use of &nbsp; ''sparse arrays'' &nbsp; minimizes the impact of the memory usage, &nbsp; as well as removing the need of having to know the minimum and maximum values &nbsp; ''a priori''.)
<br><br>
 
Line 34:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">F countingSort(a, min, max)
V cnt = [0] * (max - min + 1)
L(x) a
Line 45:
 
V data = [9, 7, 10, 2, 9, 7, 4, 3, 10, 2, 7, 10, 2, 1, 3, 8, 7, 3, 9, 5, 8, 5, 1, 6, 3, 7, 5, 4, 6, 9, 9, 6, 6, 10, 2, 4, 5, 2, 8, 2, 2, 5, 2, 9, 3, 3, 5, 7, 8, 4]
print(countingSort(data, min(data), max(data)) == sorted(data))</langsyntaxhighlight>
 
{{out}}
Line 53:
 
=={{header|360 Assembly}}==
<langsyntaxhighlight lang="360asm">* Counting sort - 18/04/2020
COUNTS CSECT
USING COUNTS,R13 base register
Line 116:
COUNT DC 200F'0' count
REGEQU
END COUNTS </langsyntaxhighlight>
{{out}}
<pre>
Line 124:
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
<lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program countSort64.s */
Line 342:
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
</syntaxhighlight>
</lang>
 
=={{header|Action!}}==
<syntaxhighlight lang="action!">DEFINE MAXSIZE="100"
 
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 CountingSort(INT ARRAY a INT size,min,max)
INT ARRAY count(MAXSIZE)
INT n,i,num,z
 
n=max-min+1
FOR i=0 TO n-1
DO count(i)=0 OD
 
FOR i=0 TO size-1
DO
num=a(i)
count(num-min)==+1
OD
 
z=0
FOR i=min TO max
DO
WHILE count(i-min)>0
DO
a(z)=i
z==+1
count(i-min)==-1
OD
OD
RETURN
 
PROC Test(INT ARRAY a INT size,min,max)
PrintE("Array before sort:")
PrintArray(a,size)
CountingSort(a,size,min,max)
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,-6,20)
Test(b,21,-10,10)
Test(c,8,101,108)
Test(d,12,-1,1)
RETURN</syntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Counting_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|ActionScript}}==
<langsyntaxhighlight ActionScriptlang="actionscript">function countingSort(array:Array, min:int, max:int)
{
var count:Array = new Array(array.length);
Line 360 ⟶ 449:
}
return array;
}</langsyntaxhighlight>
 
=={{header|Ada}}==
<syntaxhighlight lang="ada">
Given that we know the range of data, the problem really reduces to initializing the array to the ordered range of values. The input order is irrelevant.
<lang Ada>with Ada.Text_Io; use Ada.Text_Io;
with Ada.Numerics; use Ada.Numerics;
with Ada.Numerics.Float_Random; use Ada.Numerics.Float_Random;
 
procedure Counting_Sort is
type Data is array (Integer range <>) of Natural;
procedure Sort(Item : in out Data) is
minValue, maxValue: Natural;
begin
forminValue I in:= Item(Item'rangeFirst); loopmaxValue := Item(Item'First);
for I in Item(I)'Range := I;loop
if Item(I) < minValue then minValue := Item(I); end if;
if Item(I) > maxValue then maxValue := Item(I); end if;
end loop;
declare
Count : Data(minValue .. maxValue);
itemPos : Integer range Item'First - 1 .. Item'Last;
begin
for I in Count'Range loop
Count(I) := 0;
end loop;
for I in Item'Range loop
Count(Item(I)) := Count(Item(I)) + 1;
end loop;
itemPos := 0;
for I in Count'Range loop
for J in 1..Count(I) loop
itemPos := itemPos + 1;
Item(itemPos) := I;
end loop;
end loop;
end;
end Sort;
Stuff : Data(1..14030);
Seed : Generator;
begin
Put("Before: ");
for I in Stuff'Range loop
Stuff(I) := Integer( Float'Truncation( Random( seed ) * 100.0 ) );
Put(Natural'Image(Stuff(I)));
end loop;
New_Line;
Sort(Stuff);
Put("After : ");
for I in Stuff'range loop
Put(Natural'Image(Stuff(I)));
end loop;
New_Line;
end Counting_Sort;</lang>
</syntaxhighlight>
===Output===
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
{{out}}
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
<pre>
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
Before: 45 3 47 5 56 24 95 7 40 65 54 19 63 59 77 99 48 24 12 49 57 86 98 99 97 13 74 44 11 4
133 134 135 136 137 138 139 140
After : 3 4 5 7 11 12 13 19 24 24 40 44 45 47 48 49 54 56 57 59 63 65 74 77 86 95 97 98 99 99
</pre>
 
=={{header|ALGOL 68}}==
Line 396 ⟶ 518:
<br>
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386}}
<langsyntaxhighlight lang="algol68">PROC counting sort mm = (REF[]INT array, INT min, max)VOID:
(
INT z := LWB array - 1;
Line 435 ⟶ 557:
FOR i TO UPB ages DO print((" ", whole(ages[i],0))) OD;
print(new line)
)</langsyntaxhighlight>
Sample output:
 
Line 441 ⟶ 563:
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
<lang ARM Assembly>
/* ARM assembly Raspberry PI */
/* program countSort.s */
Line 645 ⟶ 767:
/***************************************************/
.include "../affichage.inc"
</syntaxhighlight>
</lang>
=={{header|Arturo}}==
 
<syntaxhighlight lang="rebol">countingSort: function [items, minimum, maximum][
a: new items
rng: inc maximum - minimum
cnt: array.of: rng 0
z: 0
 
loop 0..dec size a 'i [
mm: a\[i]-minimum
cnt\[mm]: cnt\[mm] + 1
]
 
loop minimum..maximum 'i [
loop 0..dec cnt\[i-minimum] 'j [
a\[z]: i
z: z + 1
]
]
return a
]
 
print countingSort [3 1 2 8 5 7 9 4 6] 1 9</syntaxhighlight>
 
{{out}}
 
<pre>1 2 3 4 5 6 7 8 9</pre>
 
=={{header|ATS}}==
 
<syntaxhighlight lang="ats">#include "share/atspre_staload.hats"
 
(* My ATS solution to the radix sort task includes a counting sort for
values in 0..255. Here, I will write an implementation that works
with a given range of keys. *)
 
(* - - - - - - - - - - - - - - - - - - - - - - *)
(* Interface *)
 
exception counting_sort_exception of (string)
 
extern fn {a : t@ype}
{tk : tkind}
counting_sort
{n : int}
{keymin, keymax : int | keymin <= keymax}
(arr : &array (a, n) >> _,
n : size_t n,
keymin : g1int (tk, keymin),
keymax : g1int (tk, keymax))
:<!exn,!wrt> void
 
extern fn {a : t@ype}
{tk : tkind}
counting_sort$key : a -<> g1int tk
 
(* - - - - - - - - - - - - - - - - - - - - - - *)
(* Implementation *)
 
fn {a : t@ype}
{tk : tkind}
count_entries
{n : int}
{keymin, keymax : int | keymin <= keymax}
(arr : &array (a, n),
n : size_t n,
keymin : g1int (tk, keymin),
keymax : g1int (tk, keymax),
bins : &array (size_t, keymax - keymin + 1))
:<!exn,!wrt> void =
$effmask_ntm (* The for-loop obviously terminates. *)
begin
let
prval () = lemma_array_param arr
var i : [i : nat | i <= n] size_t i
in
for (i := i2sz 0; i <> n; i := succ i)
let
val key = counting_sort$key<a> arr[i]
in
if key < keymin then
$raise counting_sort_exception ("key too low")
else if keymax < key then
$raise counting_sort_exception ("key too high")
else
bins[key - keymin] := succ bins[key - keymin]
end
end
end
 
fn {}
bin_sizes_to_indices
{num_bins : int}
(bins : &array (size_t, num_bins) >> _,
num_bins : size_t num_bins)
:<!wrt> void =
let
fun
loop {i : nat | i <= num_bins}
{accum : int}
.<num_bins - i>.
(bins : &array (size_t, num_bins) >> _,
i : size_t i,
accum : size_t accum)
:<!wrt> void =
if i <> num_bins then
let
prval () = lemma_g1uint_param i
val elem = g1ofg0 bins[i]
in
if elem = i2sz 0 then
loop (bins, succ i, accum)
else
begin
bins[i] := accum;
loop (bins, succ i, accum + elem)
end
end
 
prval () = lemma_array_param bins
in
loop (bins, i2sz 0, i2sz 0)
end
 
fn {a : t@ype}
{tk : tkind}
rearrange {n : int}
{keymin, keymax : int | keymin <= keymax}
(arr : &array (a, n) >> _,
temp : &array (a, n),
n : size_t n,
keymin : g1int (tk, keymin),
keymax : g1int (tk, keymax),
bins : &array (size_t, keymax - keymin + 1))
:<!wrt> void =
let
prval () = lemma_array_param arr
 
fun
loop {i : nat | i <= n}
.<n - i>.
(arr : &array (a, n) >> _,
temp : &array (a, n),
bins : &array (size_t, keymax - keymin + 1),
i : size_t i)
:<!wrt> void =
if i <> n then
let
val key = counting_sort$key<a><tk> temp[i]
val () = $effmask_exn assertloc (keymin <= key)
val () = $effmask_exn assertloc (key <= keymax)
val index = g1ofg0 bins[key - keymin]
prval () = lemma_g1uint_param index
val () = $effmask_exn assertloc (index < n)
val () = arr[index] := temp[i]
val () = bins[key - keymin] := succ index
in
loop (arr, temp, bins, succ i)
end
in
loop (arr, temp, bins, i2sz 0)
end
 
implement {a} {tk}
counting_sort {n} {keymin, keymax} (arr, n, keymin, keymax) =
if n <> i2sz 0 then
let
stadef num_bins = keymax - keymin + 1
val num_bins : size_t num_bins = succ (g1i2u (keymax - keymin))
 
val @(pf_bins, pfgc_bins | p_bins) =
array_ptr_alloc<size_t> num_bins
macdef bins = !p_bins
val () = array_initize_elt<size_t> (bins, num_bins, i2sz 0)
 
val () = count_entries<a><tk> (arr, n, keymin, keymax, bins)
val () = bin_sizes_to_indices<> (bins, num_bins)
 
val @(pf_temp, pfgc_temp | p_temp) = array_ptr_alloc<a> n
macdef temp = !p_temp
val () = array_copy<a> (temp, arr, n)
val () = rearrange<a><tk> (arr, temp, n, keymin, keymax, bins)
val () = array_ptr_free (pf_temp, pfgc_temp | p_temp)
 
val () = array_ptr_free (pf_bins, pfgc_bins | p_bins)
in
end
 
(* - - - - - - - - - - - - - - - - - - - - - - *)
 
typedef record = [i : int | 1 <= i; i <= 9] '(int i, string)
 
implement
counting_sort$key<record><intknd> entry =
entry.0
 
implement
main0 () =
let
val data =
$list{record}
('(8, "eight001"),
'(6, "six00001"),
'(6, "six00002"),
'(8, "eight002"),
'(1, "one00001"),
'(4, "four0001"),
'(2, "two00001"),
'(8, "eight003"))
var arr : @[record][8]
val () = array_initize_list<record> (arr, 8, data)
val () = counting_sort<record> (arr, i2sz 8, 1, 9)
 
var i : [i : nat | i <= 8] int i
in
for (i := 0; i <> 8; i := succ i)
println! (arr[i].0, " -> ", arr[i].1)
end</syntaxhighlight>
 
{{out}}
<pre>$ patscc -DATS_MEMALLOC_GCBDW -O3 counting_sort_task.dats -lgc && ./a.out
1 -> one00001
2 -> two00001
4 -> four0001
6 -> six00001
6 -> six00002
8 -> eight001
8 -> eight002
8 -> eight003</pre>
 
=={{header|AutoHotkey}}==
contributed by Laszlo on the ahk [http://www.autohotkey.com/forum/post-276465.html#276465 forum]
<langsyntaxhighlight AutoHotkeylang="autohotkey">MsgBox % CountingSort("-1,1,1,0,-1",-1,1)
 
CountingSort(ints,min,max) {
Line 661 ⟶ 1,013:
}
Return SubStr(t,2)
}</langsyntaxhighlight>
 
=={{header|BASIC256}}==
<syntaxhighlight lang="basic256">
<lang BASIC256>
# counting sort
 
Line 702 ⟶ 1,054:
next i
print
</syntaxhighlight>
</lang>
 
=={{header|BBC BASIC}}==
<langsyntaxhighlight lang="bbcbasic"> DIM test%(9)
test%() = 4, 65, 2, -31, 0, 99, 2, 83, 782, 1
PROCcountingsort(test%(), -31, 782)
Line 727 ⟶ 1,079:
ENDWHILE
NEXT
ENDPROC</langsyntaxhighlight>
'''Output:'''
<pre>
Line 734 ⟶ 1,086:
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdio.h>
#include <stdlib.h>
 
Line 768 ⟶ 1,120:
}
}
}</langsyntaxhighlight>
 
Testing (we suppose the oldest human being is less than 140 years old).
 
<langsyntaxhighlight lang="c">#define N 100
#define MAX_AGE 140
int main()
Line 782 ⟶ 1,134:
for(i=0; i < N; i++) printf("%d\n", ages[i]);
return EXIT_SUCCESS;
}</langsyntaxhighlight>
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">using System;
using System.Linq;
 
Line 820 ⟶ 1,172:
}
}
}</langsyntaxhighlight>
 
=={{header|C++}}==
<langsyntaxhighlight lang="cpp">
#include <iostream>
#include <time.h>
Line 888 ⟶ 1,240:
}
//------------------------------------------------------------------------------
</langsyntaxhighlight>
{{out}}
<pre>
Line 901 ⟶ 1,253:
Uses C++11. Compile with
g++ -std=c++11 counting.cpp
<langsyntaxhighlight lang="cpp">#include <algorithm>
#include <iterator>
#include <iostream>
Line 930 ⟶ 1,282:
copy(std::begin(a), std::end(a), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
}</langsyntaxhighlight>
Output:
<pre>
Line 939 ⟶ 1,291:
Straightforward implementation of counting sort. By using <code>[http://www.lispworks.com/documentation/HyperSpec/Body/f_map.htm map]</code> and <code>[http://www.lispworks.com/documentation/HyperSpec/Body/f_map_in.htm map-into]</code>, counting sort can work efficiently on both lists and vectors. The closure given as the second argument to <code>map-into</code> returns the sorted elements of sequence. Because <code>map-into</code> will only call the function as many times as necessary to re-populate sequence, there is no need for bounds checking. <code>counts</code> is declared to have dynamic-extent and so a compiler might stack allocate it.
 
<langsyntaxhighlight lang="lisp">(defun counting-sort (sequence &optional (min (reduce #'min sequence))
(max (reduce #'max sequence)))
(let ((i 0)
Line 950 ⟶ 1,302:
(incf i))
(decf (aref counts i))
(+ i min)))))</langsyntaxhighlight>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">import std.stdio, std.algorithm;
 
void countingSort(int[] array, in size_t min, in size_t max)
Line 979 ⟶ 1,331:
countingSort(data, dataMin, dataMax);
assert(isSorted(data));
}</langsyntaxhighlight>
 
=={{header|Delphi}}==
Line 986 ⟶ 1,338:
Straightforward implementation, no particularly interesting characteristics.
 
<langsyntaxhighlight lang="e">def countingSort(array, min, max) {
def counts := ([0] * (max - min + 1)).diverge()
for elem in array {
Line 998 ⟶ 1,350:
}
}
}</langsyntaxhighlight>
 
<pre style="height:15ex;overflow:scroll">? def arr := [34,6,8,7,4,3,56,7,8,4,3,5,7,8,6,4,4,67,9,0,0,76,467,453,34,435,37,4,34,234,435,3,2,7,4,634,534,735,5,4,6,78,4].diverge()
Line 1,006 ⟶ 1,358:
? arr
# value: [0, 0, 2, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 9, 34, 34, 34, 37, 56, 67, 76, 78, 234, 435, 435, 453, 467, 534, 634, 735].diverge()</pre>
 
=={{header|EasyLang}}==
<syntaxhighlight>
proc countsort min max . d[] .
len count[] max - min + 1
for n in d[]
count[n - min + 1] += 1
.
z = 1
for i = min to max
while count[i - min + 1] > 0
d[z] = i
z += 1
count[i - min + 1] -= 1
.
.
.
for i = 1 to 100
d[] &= randint 1000
.
countsort 1 1000 d[]
print d[]
</syntaxhighlight>
 
=={{header|Eiffel}}==
 
<syntaxhighlight lang="eiffel">
<lang Eiffel>
 
class
Line 1,080 ⟶ 1,455:
 
end
</syntaxhighlight>
</lang>
TEST:
<syntaxhighlight lang="eiffel">
<lang Eiffel>
class
APPLICATION
Line 1,123 ⟶ 1,498:
end
 
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,133 ⟶ 1,508:
 
=={{header|Elena}}==
ELENA 46.x :
<langsyntaxhighlight lang="elena">import extensions;
import system'routines;
Line 1,147 ⟶ 1,522:
int z := 0;
count.populate::(int i => 0);
for(int i := 0,; i < self.Length,; i += 1) { count[self[i] - min] := count[self[i] - min] + 1 };
for(int i := min,; i <= max,; i += 1)
{
while (count[i - min] > 0)
Line 1,166 ⟶ 1,541:
public program()
{
var list := new Range(0, 10).selectBy::(i => randomGenerator.evalnextInt(10)).toArray();
console.printLine("before:", list.asEnumerable());
console.printLine("after :", list.countingSort().asEnumerable())
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,179 ⟶ 1,554:
=={{header|Elixir}}==
{{works with|Elixir|1.1}}
<langsyntaxhighlight lang="elixir">defmodule Sort do
def counting_sort([]), do: []
def counting_sort(list) do
Line 1,192 ⟶ 1,567:
end
 
IO.inspect Sort.counting_sort([1,-2,-3,2,1,-5,5,5,4,5,9])</langsyntaxhighlight>
 
{{out}}
Line 1,202 ⟶ 1,577:
{{works with|Fortran|95 and later}}
 
<langsyntaxhighlight lang="fortran">module CountingSort
implicit none
 
Line 1,244 ⟶ 1,619:
end subroutine counting_sort_mm
 
end module CountingSort</langsyntaxhighlight>
 
Testing:
 
<langsyntaxhighlight lang="fortran">program test
use CountingSort
implicit none
Line 1,264 ⟶ 1,639:
write(*,'(I4)') ages
 
end program test</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' FB 1.05.0 Win64
 
Function findMax(array() As Integer) As Integer
Line 1,325 ⟶ 1,700:
Print
Print "Press any key to quit"
Sleep</langsyntaxhighlight>
 
{{out}}
Line 1,335 ⟶ 1,710:
=={{header|Go}}==
This version follows the task pseudocode above, with one more optimization.
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,379 ⟶ 1,754:
}
}
}</langsyntaxhighlight>
This version follows the WP pseudocode. It can be adapted to sort items other than integers.
<langsyntaxhighlight lang="go">package main
 
import (
Line 1,430 ⟶ 1,805:
}
copy(a, output)
}</langsyntaxhighlight>
 
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">def countingSort = { array ->
def max = array.max()
def min = array.min()
Line 1,441 ⟶ 1,816:
array.each { count[it] ++ }
(min..max).findAll{ count[it] }.collect{ [it]*count[it] }.flatten()
}</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang="groovy">println countingSort([23,76,99,58,97,57,35,89,51,38,95,92,24,46,31,24,14,12,57,78,4])
println countingSort([88,18,31,44,4,0,8,81,14,78,20,76,84,33,73,75,82,5,62,70,12,7,1])
 
Line 1,450 ⟶ 1,825:
println countingSort([34,6,8,7,4,3,56,7,8,4,3,5,7,8,6,4,4,67,9,0,0,76,467,453,34,435,37,4,34,234,435,3,2,7,4,634,534,-735,5,4,6,78,4])
// slo-o-o-o-ow due to unnecessarily large counting array
println countingSort([10000033,10000006,10000008,10000009,10000013,10000031,10000013,10000032,10000023,10000023,10000011,10000012,10000021])</langsyntaxhighlight>
 
Output:
Line 1,462 ⟶ 1,837:
We use lists for input and output rather than arrays, since lists are used more often in Haskell.
 
<langsyntaxhighlight lang="haskell">import Data.Array
countingSort :: (Ix n) => [n] -> n -> n -> [n]
countingSort l lo hi = concatMap (uncurry $ flip replicate) count
where count = assocs . accumArray (+) 0 (lo, hi) . map (\i -> (i, 1)) $ l</langsyntaxhighlight>
 
=={{header|Haxe}}==
{{trans|C}}
<langsyntaxhighlight lang="haxe">class CountingSort {
public static function sort(arr:Array<Int>) {
var min = arr[0], max = arr[0];
Line 1,502 ⟶ 1,877:
Sys.println('Sorted Integers: ' + integerArray);
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,513 ⟶ 1,888:
The following example is hopefully in the spirit of a counting sort using a hash table as a substituted for a sparse array. Simply translating the pseudo-code would be very un-Iconish (as opposed to Uniconish).
 
<langsyntaxhighlight Iconlang="icon">procedure main() #: demonstrate various ways to sort a list and string
write("Sorting Demo using ",image(countingsort))
writes(" on list : ")
Line 1,535 ⟶ 1,910:
every put(X := [],( 1 to T[i := lower to upper], i) ) # reconstitute with correct order and count
return X
end</langsyntaxhighlight>
 
Note: This example relies on [[Sorting_algorithms/Bubble_sort#Icon| the supporting procedures 'display sort', and 'writex' from Bubble Sort]].
Line 1,545 ⟶ 1,920:
=={{header|Io}}==
{{trans|Java}}
<langsyntaxhighlight lang="io">List do(
countingSort := method(min, max,
count := list() setSize(max - min + 1) mapInPlace(0)
Line 1,568 ⟶ 1,943:
 
l := list(2, 3, -4, 5, 1)
l countingSortInPlace println # ==> list(-4, 1, 2, 3, 5)</langsyntaxhighlight>
 
A more functional-like version:
<langsyntaxhighlight lang="io">List do(
fill := method(x, size,
/* Resizes list to a given size and fills it with a given value. */
Line 1,593 ⟶ 1,968:
 
l := list(2, 3, -4, 5, 1)
l countingSortInPlace println # ==> list(-4, 1, 2, 3, 5)</langsyntaxhighlight>
 
=={{header|IS-BASIC}}==
<syntaxhighlight lang="is-basic">
<lang IS-BASIC>
100 PROGRAM "CountSrt.bas"
110 RANDOMIZE
Line 1,643 ⟶ 2,018:
540 LOOP
550 NEXT
560 END DEF</langsyntaxhighlight>
 
=={{header|J}}==
{{eff note|J|/:~}}
<langsyntaxhighlight lang="j">csort =: monad define
min =. <./y
cnt =. 0 $~ 1+(>./y)-min
Line 1,654 ⟶ 2,029:
end.
cnt # min+i.#cnt
)</langsyntaxhighlight>
 
Alternative implementation:
 
<langsyntaxhighlight lang="j">csort=: (+/@(=/) # ]) >./ (] + 1 i.@+ -) <./</langsyntaxhighlight>
 
 
'''Example:'''
<langsyntaxhighlight lang="j"> ] a =. _3 + 20 ?@$ 10
_2 _2 6 _1 1 6 _1 4 4 1 4 4 5 _3 5 3 0 _1 3 4
 
csort a
_3 _2 _2 _1 _1 _1 0 1 1 3 3 4 4 4 4 4 5 5 6 6</langsyntaxhighlight>
 
And note that this can be further simplified if the range is known in advance (which could easily be the case -- this sorting mechanism is practical when we have a small fixed range of values that we are sorting). Here, we do not need to inspect the data to find min and max values, since they are already known:
 
<langsyntaxhighlight lang="j">csrt=:2 :0
(m+i.n-m) (+/@(=/)~ # [) ]
)</langsyntaxhighlight>
 
or
 
<langsyntaxhighlight lang="j">csrt=:2 :0
(+/@(=/) # ])&(m+i.n-m)
)</langsyntaxhighlight>
 
Example:
 
<langsyntaxhighlight lang="j"> (_3 csrt 17) a
_3 _2 _2 _1 _1 _1 0 1 1 3 3 4 4 4 4 4 5 5 6 6</langsyntaxhighlight>
 
=={{header|Java}}==
{{works with|Java|1.5+}}
<langsyntaxhighlight lang="java5">public static void countingSort(int[] array, int min, int max){
int[] count= new int[max - min + 1];
for(int number : array){
Line 1,700 ⟶ 2,075:
}
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
 
<langsyntaxhighlight lang="javascript">var countSort = function(arr, min, max) {
var i, z = 0, count = [];
Line 1,721 ⟶ 2,096:
}
}</langsyntaxhighlight>
 
Testing:
 
<langsyntaxhighlight lang="javascript">// Line breaks are in HTML
 
var i, ages = [];
Line 1,737 ⟶ 2,112:
for (i = 0; i < 100; i++) {
document.write(ages[i] + "<br />");
}</langsyntaxhighlight>
 
=={{header|jq}}==
Line 1,746 ⟶ 2,121:
object is used instead. This ensures the space requirement is just O(length). In jq, this approach is both time and space
efficient, except for the small cost of converting integers to strings, which is necessary because JSON keys must be strings.
<langsyntaxhighlight lang="jq">def countingSort(min; max):
. as $in
| reduce range(0;length) as $i
Line 1,760 ⟶ 2,135:
else reduce range(0; $hash[$s]) as $j (.; . + [$i])
end
);</langsyntaxhighlight>
'''Example''':
<langsyntaxhighlight lang="jq"> [1,2,1,4,0,10] | countingSort(0;10)</langsyntaxhighlight>
{{out}}
<syntaxhighlight lang="sh">
<lang sh>
$ jq -M -c -n -f counting_sort.jq
[0,1,1,2,4,10]</langsyntaxhighlight>
 
=={{header|Julia}}==
Line 1,772 ⟶ 2,147:
This is a translation of the pseudocode presented in the task description, accounting for the fact that Julia arrays start indexing at 1 rather than zero and taking care to return a result of the same type as the input. Note that <code>cnt</code> has the machine's standard integer type (typically <code>Int64</code>), which need not match that of the input.
 
<langsyntaxhighlight lang="julia">function countsort(a::Vector{<:Integer})
lo, hi = extrema(a)
b = zeros(a)
Line 1,791 ⟶ 2,166:
println("# unsorted bytes: $v\n -> sorted bytes: $(countsort(v))")
v = rand(1:2 ^ 10, 20)
println("# unsorted integers: $v\n -> sorted integers: $(countsort(v))")</langsyntaxhighlight>
 
{{out}}
Line 1,800 ⟶ 2,175:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="scala">// version 1.1.0
 
fun countingSort(array: IntArray) {
Line 1,821 ⟶ 2,196:
countingSort(array)
println("Sorted : ${array.asList()}")
}</langsyntaxhighlight>
 
{{out}}
Line 1,830 ⟶ 2,205:
 
=={{header|langur}}==
<syntaxhighlight lang="langur">val .countingSort = fn(.list) {
{{works with|langur|0.10}}
val .min, .max = minmax(.list)
Prior to 0.10, multi-variable declaration/assignment would use parentheses around variable names and values.
var .count = [0] * (.max-.min+1)
 
for .i in .list { .count[.i-.min+1] += 1 }
<lang langur>val .countingSort = f(.array) {
for .i of .count { _for ~= .count[.i] * [.i+.min-1] }
val .min, .max = minmax(.array)
var .count = arr .max-.min+1, 0
for .i in .array { .count[.i-.min+1] += 1 }
for .i of .count { _for ~= arr .count[.i], .i+.min-1 }
}
 
Line 1,843 ⟶ 2,215:
 
writeln "Original: ", .data
writeln "Sorted : ", .countingSort(.data)</lang>
</syntaxhighlight>
 
{{out}}
Line 1,850 ⟶ 2,223:
 
=={{header|Lua}}==
<langsyntaxhighlight lang="lua">function CountingSort( f )
local min, max = math.min( unpack(f) ), math.max( unpack(f) )
local count = {}
Line 1,879 ⟶ 2,252:
for i in next, f do
print( f[i] )
end</langsyntaxhighlight>
 
=={{header|M4}}==
<langsyntaxhighlight M4lang="m4">divert(-1)
 
define(`randSeed',141592653)
Line 1,917 ⟶ 2,290:
show(`a')
countingsort(`a',0,99)
show(`a')</langsyntaxhighlight>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">countingSort[list_] := Module[{minElem, maxElem, count, z, number},
minElem = Min[list]; maxElem = Max[list];
count = ConstantArray[0, (maxElem - minElem + 1)];
Line 1,931 ⟶ 2,304:
count[[i - minElem + 1]] = count[[i - minElem + 1]] - 1;]
];
]</langsyntaxhighlight>
 
<pre>countingSort@{2, 3, 1, 5, 7, 6}
->{1, 2, 3, 5, 6, 7}</pre>
Line 1,939 ⟶ 2,311:
This is a direct translation of the pseudo-code, except to compensate for MATLAB using 1 based arrays.
 
<langsyntaxhighlight MATLABlang="matlab">function list = countingSort(list)
 
minElem = min(list);
Line 1,960 ⟶ 2,332:
end
end %countingSort</langsyntaxhighlight>
 
Sample Usage:
<langsyntaxhighlight MATLABlang="matlab">>> countingSort([4 3 1 5 6 2])
 
ans =
 
1 2 3 4 5 6</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<syntaxhighlight lang="maxscript">
<lang MAXScript>
fn countingSort arr =
(
Line 1,993 ⟶ 2,365:
)
return arr
)</langsyntaxhighlight>
{{out}}
<syntaxhighlight lang="maxscript">
<lang MAXScript>
a = for i in 1 to 15 collect random 1 30
#(7, 1, 6, 16, 27, 11, 24, 16, 25, 11, 22, 7, 28, 15, 17)
countingSort a
#(1, 6, 7, 7, 11, 11, 15, 16, 16, 17, 22, 24, 25, 27, 28)
</syntaxhighlight>
</lang>
 
=={{header|Modula-3}}==
<langsyntaxhighlight lang="modula3">MODULE Counting EXPORTS Main;
 
IMPORT IO, Fmt;
Line 2,043 ⟶ 2,415:
END;
IO.Put("\n");
END Counting.</langsyntaxhighlight>
Output:
<pre>
Line 2,052 ⟶ 2,424:
=={{header|Nanoquery}}==
{{trans|Java}}
<langsyntaxhighlight lang="nanoquery">def countingSort(array, min, max)
count = {0} * (max - min + 1)
 
Line 2,067 ⟶ 2,439:
end
end
end</langsyntaxhighlight>
 
=={{header|NetRexx}}==
===Version 1===
An almost direct implementation of the pseudocode.
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref savelog symbols binary
 
Line 2,141 ⟶ 2,513:
 
return array
</syntaxhighlight>
</lang>
{{out}}
<pre style="overflow: scroll;">
Line 2,150 ⟶ 2,522:
===Version 2===
A more Rexx-like (and shorter) version. Due to NetRexx's built in indexed string capability, negative values are also easily supported.
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref symbols nobinary
 
Line 2,200 ⟶ 2,572:
 
return
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,208 ⟶ 2,580:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">proc countingSort[T](a: var openarray[T]; min, max: int) =
let range = max - min + 1
var count = newSeq[T](range)
Line 2,222 ⟶ 2,594:
var a = @[5, 3, 1, 7, 4, 1, 1, 20]
countingSort(a, 1, 20)
echo a</langsyntaxhighlight>
Output:
<pre>@[1, 1, 1, 3, 4, 5, 7, 20]</pre>
 
=={{header|Oberon-2}}==
{{trans|Modula-3}}
<syntaxhighlight lang="oberon2">MODULE CS;
 
IMPORT Out;
 
VAR
A:ARRAY 8 OF INTEGER;
I:LONGINT;
 
PROCEDURE Init(VAR A:ARRAY OF INTEGER);
BEGIN
A[0] := 80; A[1] := 10; A[2] := 40; A[3] := 60;
A[4] := 50; A[5] := 30; A[6] := 20; A[7] := 70;
END Init;
 
PROCEDURE CountingSort(VAR A:ARRAY OF INTEGER; Min,Max:INTEGER);
VAR
I,Z,Range:LONGINT;
Count:POINTER TO ARRAY OF INTEGER;
BEGIN
Range := Max - Min + 1;
NEW(Count, Range);
Z := 0;
FOR I := 0 TO LEN(A)-1 DO
INC(Count[A[I] - Min]);
END;
FOR I := Min TO Max DO
WHILE(Count[I - Min] > 0) DO
A[Z] := SHORT(I);
INC(Z);
DEC(Count[I - Min]);
END;
END;
END CountingSort;
 
BEGIN
Init(A);
CountingSort(A, 10, 80);
FOR I := 0 TO LEN(A)-1 DO
Out.Int(A[I],0); Out.String(" ");
END;
Out.Ln;
END CS.
</syntaxhighlight>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">
bundle Default {
class Cocktail {
Line 2,258 ⟶ 2,676:
}
}
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
For arrays:
<langsyntaxhighlight lang="ocaml">let counting_sort_array arr lo hi =
let count = Array.make (hi-lo+1) 0 in
Array.iter (fun i -> count.(i-lo) <- count.(i-lo) + 1) arr;
Array.concat (Array.to_list (Array.mapi (fun i x -> Array.make x (lo+i)) count))</langsyntaxhighlight>
 
=={{header|Octave}}==
This implements the same algorithm but in a more compact way (using the same loop to count and to ''update'' the sorted vector). This implementation is ''elegant'' (and possible since the sort is not done "in place"), but not so efficient on machines that can't parallelize some operations (the vector <tt>arr</tt> is scanned for every value between <tt>minval</tt> and <tt>maxval</tt>)
<langsyntaxhighlight lang="octave">function r = counting_sort(arr, minval, maxval)
r = arr;
z = 1;
Line 2,278 ⟶ 2,696:
endwhile
endfor
endfunction</langsyntaxhighlight>
 
Testing:
 
<langsyntaxhighlight lang="octave">ages = unidrnd(140, 100, 1);
sorted = counting_sort(ages, 0, 140);
disp(sorted);</langsyntaxhighlight>
 
=={{header|Oz}}==
Using arrays as in the original algorithm. The implementation is slightly simpler because arrays can start with an arbitrary index in Oz.
<langsyntaxhighlight lang="oz">declare
proc {CountingSort Arr Min Max}
Count = {Array.new Min Max 0}
Line 2,311 ⟶ 2,729:
in
{CountingSort A 1 9}
{Show {Array.toRecord unit A}}</langsyntaxhighlight>
 
Using lists for input and output and a dictionary as a sparse array:
<langsyntaxhighlight lang="oz">declare
fun {CountingSort Xs}
Count = {Dictionary.new}
Line 2,334 ⟶ 2,752:
end
in
{Show {CountingSort [3 1 4 1 5 9 2 6 5]}}</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">countingSort(v,mn,mx)={
my(u=vector(#v),i=0);
for(n=mn,mx,
Line 2,343 ⟶ 2,761:
);
u
};</langsyntaxhighlight>
 
=={{header|Pascal}}==
<langsyntaxhighlight lang="pascal">program CountingSort;
 
procedure counting_sort(var arr : Array of Integer; n, min, max : Integer);
Line 2,377 ⟶ 2,795:
for i := 0 to 99 do
writeln(ages[i]);
end.</langsyntaxhighlight>
 
=={{header|Perl}}==
 
<langsyntaxhighlight lang="perl">#! /usr/bin/perl
use strict;
 
Line 2,393 ⟶ 2,811:
my $i = $min;
@$a = map {($i++) x $_} @cnt;
}</langsyntaxhighlight>
 
Testing:
 
<langsyntaxhighlight lang="perl">my @ages = map {int(rand(140))} 1 .. 100;
counting_sort(\@ages, 0, 140);
print join("\n", @ages), "\n";</langsyntaxhighlight>
 
=={{header|Phix}}==
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
Line 2,424 ⟶ 2,842:
<span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span> <span style="color: #0000FF;">=</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>
<span style="color: #0000FF;">?</span><span style="color: #000000;">countingSort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">min</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">max</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">))</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 2,432 ⟶ 2,850:
=={{header|PHP}}==
 
<langsyntaxhighlight lang="php"><?php
 
function counting_sort(&$arr, $min, $max)
Line 2,452 ⟶ 2,870:
}
}
}</langsyntaxhighlight>
 
Testing:
 
<langsyntaxhighlight lang="php">$ages = array();
for($i=0; $i < 100; $i++) {
array_push($ages, rand(0, 140));
Line 2,465 ⟶ 2,883:
echo $ages[$i] . "\n";
}
?></langsyntaxhighlight>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de countingSort (Lst Min Max)
(let Count (need (- Max Min -1) 0)
(for N Lst
Line 2,477 ⟶ 2,895:
(do (car C) (link (car I))) )
Count
(range Min Max) ) ) ) )</langsyntaxhighlight>
Output:
 
Line 2,484 ⟶ 2,902:
 
=={{header|PL/I}}==
<langsyntaxhighlight PLlang="pl/Ii">count_sort: procedure (A);
declare A(*) fixed;
declare (min, max) fixed;
Line 2,512 ⟶ 2,930:
end;
end;
end count_sort;</langsyntaxhighlight>
 
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
<lang PowerShell>
function countingSort($array) {
$minmax = $array | Measure-Object -Minimum -Maximum
Line 2,537 ⟶ 2,955:
"$array"
"$(countingSort $array)"
</syntaxhighlight>
</lang>
<b>Output:</b>
<pre>
Line 2,545 ⟶ 2,963:
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Procedure Counting_sort(Array data_array(1), min, max)
Define i, j
Dim c(max - min)
Line 2,560 ⟶ 2,978:
Wend
Next
EndProcedure</langsyntaxhighlight>
 
=={{header|Python}}==
Follows the spirit of the counting sort but uses Pythons defaultdict(int) to initialize array accesses to zero, and list concatenation:
<langsyntaxhighlight lang="python">>>> from collections import defaultdict
>>> def countingSort(array, mn, mx):
count = defaultdict(int)
Line 2,577 ⟶ 2,995:
>>> mini,maxi = 1,10
>>> countingSort(data, mini, maxi) == sorted(data)
True</langsyntaxhighlight>
 
Using a list:
{{works with|Python|2.6}}
<langsyntaxhighlight lang="python">def countingSort(a, min, max):
cnt = [0] * (max - min + 1)
for x in a:
Line 2,587 ⟶ 3,005:
return [x for x, n in enumerate(cnt, start=min)
for i in xrange(n)]</langsyntaxhighlight>
 
=={{header|Quackery}}==
 
<syntaxhighlight lang="quackery"> [ 2dup peek 1+
unrot poke ] is [1+] ( [ n --> [ )
[ 1+ dip tuck -
rot 0 swap of
swap rot witheach
[ over +
rot swap [1+]
swap ]
negate swap
[] swap witheach
[ dip [ over i^ + ]
of join ]
nip ] is csort ( [ n n --> [ )
[] 15 times
[ 10 random 10 + join ]
dup say "Before: " echo cr
10 19 csort
say "After: " echo</syntaxhighlight>
 
{{out}}
 
<pre>Before: [ 16 14 15 10 19 18 12 16 12 14 10 13 12 15 18 ]
After: [ 10 10 12 12 12 13 14 14 15 15 16 16 18 18 19 ]</pre>
 
=={{header|R}}==
{{trans|Octave}}
<langsyntaxhighlight Rlang="r">counting_sort <- function(arr, minval, maxval) {
r <- arr
z <- 1
Line 2,610 ⟶ 3,057:
ages <- floor(runif(100, 0, 140+1))
sorted <- counting_sort(ages, 0, 140)
print(sorted)</langsyntaxhighlight>
 
=={{header|Racket}}==
<langsyntaxhighlight lang="racket">
#lang racket
 
Line 2,626 ⟶ 3,073:
 
(counting-sort (vector 0 9 3 8 1 -1 1 2 3 7 4) -1 10)
</syntaxhighlight>
</lang>
Output:
<langsyntaxhighlight lang="racket">
'#(-1 0 1 1 2 3 3 4 7 8 9)
</syntaxhighlight>
</lang>
 
=={{header|Raku}}==
(formerly Perl 6)
{{Works with|rakudo|2018.03}}
<syntaxhighlight lang="raku" perl6line>sub counting-sort (@ints) {
my $off = @ints.min;
(my @counts)[$_ - $off]++ for @ints;
Line 2,647 ⟶ 3,094:
say @ages.sort;
 
say @ages.&counting-sort.join eq @ages.sort.join ?? 'ok' !! 'not ok';</langsyntaxhighlight>
{{out}}
<pre>(5 5 5 7 9 17 19 19 20 21 25 27 28 30 32 34 38 40 41 45 48 49 50 51 53 54 55 56 59 62 65 66 67 69 70 73 74 81 83 85 87 91 91 93 94 96 99 99 100 101)
Line 2,659 ⟶ 3,106:
Negative, zero, and positive integers are supported.
===version 1===
<langsyntaxhighlight lang="rexx">/*REXX pgm sorts an array of integers (can be negative) using the count─sort algorithm.*/
$= '1 3 6 2 7 13 20 12 21 11 22 10 23 9 24 8 25 43 62 42 63 41 18 42 17 43 16 44 15 45 14 46 79 113 78 114 77 39 78 38'
#= words($); w= length(#); _!.= 0 /* [↑] a list of some Recaman numbers.*/
m= 01; LO= word($, 1#); HI= LO /*M: max width of any numberinteger in $ @. list*/
do ij=1 for #; z= word($, ij)+0; @.ij= z; m= max(m, length(z) ) /*get from $ list. */
_ !.z= _!.z + 1; LO= min(LO, z); HI= max(HI, z) /*find the LO &and HI.*/
end /*ij*/
/*W: max index width for the @. array.*/
call show 'before sort: '; say copies('▓', 55) /*show the before array elements. */
call countSort # say copies('▒', 55) /*showsort a separatornumber lineof (before/after)entries of @. array.*/
call countSort # /*sort a number of entries of @. array.*/
call show ' after sort: ' /*show the after array elements. */
exit /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
countSort: parse arg N; x= 1; do k=LO to HI; do x=x for _!.k; @.x= k; end /*x*/
end /*k*/
return
/*──────────────────────────────────────────────────────────────────────────────────────*/
show: do s=1 for #; say right("element",20) right(s,w) arg(1) right(@.s,m); end; return</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default input:}}
 
Line 2,723 ⟶ 3,169:
element 39 before sort: 78
element 40 before sort: 38
▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
element 1 after sort: 1
element 2 after sort: 2
Line 2,767 ⟶ 3,213:
 
===version 2===
 
 
{{trans|PL/I}}
<langsyntaxhighlight lang="rexx">/* REXX ---------------------------------------------------------------
* 13.07.2014 Walter Pachl translated from PL/I
* 27.05.2023 Walter Pachl take care of bad lists
*--------------------------------------------------------------------*/
Parse Arg alist
alist='999 888 777 1 5 13 15 17 19 21 5'
If alist='*' Then
alist='999 888 777 1 5 13 15 17 19 21 5'
Select
When alist='' Then Call exit 'List is empty'
When words(alist)=1 Then Call exit 'List has only one element:' alist
Otherwise Nop
End
Parse Var alist lo hi .
Do i=1 By 1 While alist<>''
Line 2,810 ⟶ 3,266:
End
Say ol
Return</lang>
 
exit:
Say arg(1)
</syntaxhighlight>
'''Output:'''
<pre>before count_sort
Line 2,818 ⟶ 3,278:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
aList = [4, 65, 2, 99, 83, 782, 1]
see countingSort(aList, 1, 782)
Line 2,841 ⟶ 3,301:
next
return f
</syntaxhighlight>
</lang>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">class Array
def counting_sort!
replace counting_sort
Line 2,864 ⟶ 3,324:
# => [-3, -1, 9, -6, -8, -3, 5, -7, 4, 0, 5, 0, 2, -2, -6, 10, -10, -7, 5, -7]
p ary.counting_sort
# => [-10, -8, -7, -7, -7, -6, -6, -3, -3, -2, -1, 0, 0, 2, 4, 5, 5, 5, 9, 10]</langsyntaxhighlight>
 
=={{header|Rust}}==
 
<langsyntaxhighlight lang="rust">fn counting_sort(
mut data: Vec<usize>,
min: usize,
Line 2,901 ⟶ 3,361:
let arr3 = vec![10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
println!("{:?}", counting_sort(arr3, 0, 10));
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,910 ⟶ 3,370:
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">def countSort(input: List[Int], min: Int, max: Int): List[Int] =
input.foldLeft(Array.fill(max - min + 1)(0)) { (arr, n) =>
arr(n - min) += 1
Line 2,916 ⟶ 3,376:
}.zipWithIndex.foldLeft(List[Int]()) {
case (lst, (cnt, ndx)) => List.fill(cnt)(ndx + min) ::: lst
}.reverse</langsyntaxhighlight>
 
It's better (i.e. slightly faster) to reverse the frequencies list before processing it, instead of the whole result
<langsyntaxhighlight lang="scala">def countSort(input: List[Int], min: Int, max: Int): List[Int] =
input.foldLeft(Array.fill(max - min + 1)(0)) { (arr, n) =>
arr(n - min) += 1
Line 2,925 ⟶ 3,385:
}.zipWithIndex.reverse.foldLeft(List[Int]()) {
case (lst, (cnt, ndx)) => List.fill(cnt)(ndx + min) ::: lst
}</langsyntaxhighlight>
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">func counting_sort(a, min, max) {
var cnt = ([0] * (max - min + 1))
a.each {|i| cnt[i-min]++ }
Line 2,935 ⟶ 3,395:
 
var a = 100.of { 100.irand }
say counting_sort(a, 0, 100)</langsyntaxhighlight>
 
=={{header|Slate}}==
 
<langsyntaxhighlight lang="slate">s@(Sequence traits) countingSort &min: min &max: max
[| counts index |
min `defaultsTo: (s reduce: #min: `er).
Line 2,954 ⟶ 3,414:
].
s
].</langsyntaxhighlight>
 
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
 
<langsyntaxhighlight lang="smalltalk">OrderedCollection extend [
countingSortWithMin: min andMax: max [
|oc z|
Line 2,975 ⟶ 3,435:
]
]
].</langsyntaxhighlight>
 
Testing:
 
<langsyntaxhighlight lang="smalltalk">|ages|
 
ages := OrderedCollection new.
Line 2,988 ⟶ 3,448:
 
ages countingSortWithMin: 0 andMax: 140.
ages printNl.</langsyntaxhighlight>
 
=={{header|Tcl}}==
{{works with|Tcl|8.5}}
<langsyntaxhighlight lang="tcl">proc countingsort {a {min ""} {max ""}} {
# If either of min or max weren't given, compute them now
if {$min eq ""} {
Line 3,032 ⟶ 3,492:
for {set i 0} {$i < 50} {incr i} {lappend a [expr {1+ int(rand()*10)}]}
puts $a
puts [countingsort $a]</langsyntaxhighlight>
<pre>9 7 10 2 9 7 4 3 10 2 7 10 2 1 3 8 7 3 9 5 8 5 1 6 3 7 5 4 6 9 9 6 6 10 2 4 5 2 8 2 2 5 2 9 3 3 5 7 8 4
1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 5 5 5 5 5 5 6 6 6 6 7 7 7 7 7 7 8 8 8 8 9 9 9 9 9 9 10 10 10 10
Line 3,038 ⟶ 3,498:
 
=={{header|VBA}}==
{{trans|Phix}}<langsyntaxhighlight lang="vb">Option Base 1
Private Function countingSort(array_ As Variant, mina As Long, maxa As Long) As Variant
Dim count() As Integer
Line 3,058 ⟶ 3,518:
s = [{5, 3, 1, 7, 4, 1, 1, 20}]
Debug.Print Join(countingSort(s, WorksheetFunction.Min(s), WorksheetFunction.Max(s)), ", ")
End Sub</langsyntaxhighlight>{{out}}
<pre>1, 1, 1, 3, 4, 5, 7, 20</pre>
 
Line 3,065 ⟶ 3,525:
 
=====Implementation=====
<langsyntaxhighlight lang="vb">function findMax( a )
dim num
dim max
Line 3,106 ⟶ 3,566:
next
countingSort = a
end function</langsyntaxhighlight>
 
=====Invocation=====
<langsyntaxhighlight lang="vb">dim a
a = array(300, 1, -2, 3, -4, 5, -6, 7, -8, 100, 11 )
wscript.echo join( a, ", " )
countingSort a
wscript.echo join( a, ", " )</langsyntaxhighlight>
 
=====Output=====
Line 3,121 ⟶ 3,581:
</pre>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="v (vlang)">fn counting_sort(arr mut arr []int, min int, max int) {
println('Input: ' + arr.str())
mut count := [0].repeat(max - min + 1)
Line 3,145 ⟶ 3,605:
mut arr := [6, 2, 1, 7, 6, 8]
counting_sort(mut arr, 1, 8)
}</langsyntaxhighlight>
{{out}}
<pre>Input: [6, 2, 1, 7, 6, 8]
Line 3,151 ⟶ 3,611:
 
=={{header|Wren}}==
<langsyntaxhighlight ecmascriptlang="wren">var countingSort = Fn.new { |a, min, max|
var count = List.filled(max - min + 1, 0)
for (n in a) count[n - min] = count[n - min] + 1
Line 3,169 ⟶ 3,629:
var max = a.reduce { |max, i| (i > max) ? i : max }
countingSort.call(a, min, max)
System.print("Sorted : %(a)")</langsyntaxhighlight>
 
{{out}}
Line 3,178 ⟶ 3,638:
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">include c:\cxpl\codes;
 
proc CountingSort(Array, Min, Max, Size); \Sort Array
Line 3,200 ⟶ 3,660:
CountingSort(A, -5, 9, 10);
for I:= 0 to 10-1 do [IntOut(0, A(I)); ChOut(0, ^ )];
]</langsyntaxhighlight>
 
{{out}}
Line 3,208 ⟶ 3,668:
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn countingSort(array, min, max){ // modifies array
count:=(max - min + 1).pump(List().write,0); // array of (max - min + 1) zeros
foreach number in (array){
Line 3,218 ⟶ 3,678:
}
array
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">array:=List(4, 65, 2, -31, 0, 99, 2, 83, 182, 1);
countingSort(array,(0).min(array), (0).max(array)).println();</langsyntaxhighlight>
{{out}}
<pre>L(-31,0,1,2,2,4,65,83,99,182)</pre>
885

edits