Sorting algorithms/Counting sort: Difference between revisions
m
syntax highlighting fixup automation
Thundergnat (talk | contribs) m (syntax highlighting fixup automation) |
|||
Line 34:
{{trans|Python}}
<
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))</
{{out}}
Line 53:
=={{header|360 Assembly}}==
<
COUNTS CSECT
USING COUNTS,R13 base register
Line 116:
COUNT DC 200F'0' count
REGEQU
END COUNTS </
{{out}}
<pre>
Line 124:
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight 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>
=={{header|Action!}}==
<
PROC PrintArray(INT ARRAY a INT size)
Line 408:
Test(c,8,101,108)
Test(d,12,-1,1)
RETURN</
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Counting_sort.png Screenshot from Atari 8-bit computer]
Line 434:
=={{header|ActionScript}}==
<
{
var count:Array = new Array(array.length);
Line 449:
}
return array;
}</
=={{header|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.
<
procedure Counting_Sort is
Line 470:
end loop;
New_Line;
end Counting_Sort;</
===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
Line 485:
<br>
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386}}
<
(
INT z := LWB array - 1;
Line 524:
FOR i TO UPB ages DO print((" ", whole(ages[i],0))) OD;
print(new line)
)</
Sample output:
Line 530:
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
/* ARM assembly Raspberry PI */
/* program countSort.s */
Line 734:
/***************************************************/
.include "../affichage.inc"
</syntaxhighlight>
=={{header|Arturo}}==
<
a: new items
rng: inc maximum - minimum
Line 757:
]
print countingSort [3 1 2 8 5 7 9 4 6] 1 9</
{{out}}
Line 765:
=={{header|ATS}}==
<
(* My ATS solution to the radix sort task includes a counting sort for
Line 952:
for (i := 0; i <> 8; i := succ i)
println! (arr[i].0, " -> ", arr[i].1)
end</
{{out}}
Line 967:
=={{header|AutoHotkey}}==
contributed by Laszlo on the ahk [http://www.autohotkey.com/forum/post-276465.html#276465 forum]
<
CountingSort(ints,min,max) {
Line 980:
}
Return SubStr(t,2)
}</
=={{header|BASIC256}}==
<syntaxhighlight lang="basic256">
# counting sort
Line 1,021:
next i
print
</syntaxhighlight>
=={{header|BBC BASIC}}==
<
test%() = 4, 65, 2, -31, 0, 99, 2, 83, 782, 1
PROCcountingsort(test%(), -31, 782)
Line 1,046:
ENDWHILE
NEXT
ENDPROC</
'''Output:'''
<pre>
Line 1,053:
=={{header|C}}==
<
#include <stdlib.h>
Line 1,087:
}
}
}</
Testing (we suppose the oldest human being is less than 140 years old).
<
#define MAX_AGE 140
int main()
Line 1,101:
for(i=0; i < N; i++) printf("%d\n", ages[i]);
return EXIT_SUCCESS;
}</
=={{header|C sharp|C#}}==
<
using System.Linq;
Line 1,139:
}
}
}</
=={{header|C++}}==
<
#include <iostream>
#include <time.h>
Line 1,207:
}
//------------------------------------------------------------------------------
</
{{out}}
<pre>
Line 1,220:
Uses C++11. Compile with
g++ -std=c++11 counting.cpp
<
#include <iterator>
#include <iostream>
Line 1,249:
copy(std::begin(a), std::end(a), std::ostream_iterator<int>(std::cout, " "));
std::cout << "\n";
}</
Output:
<pre>
Line 1,258:
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.
<
(max (reduce #'max sequence)))
(let ((i 0)
Line 1,269:
(incf i))
(decf (aref counts i))
(+ i min)))))</
=={{header|D}}==
<
void countingSort(int[] array, in size_t min, in size_t max)
Line 1,298:
countingSort(data, dataMin, dataMax);
assert(isSorted(data));
}</
=={{header|Delphi}}==
Line 1,305:
Straightforward implementation, no particularly interesting characteristics.
<
def counts := ([0] * (max - min + 1)).diverge()
for elem in array {
Line 1,317:
}
}
}</
<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,328:
=={{header|Eiffel}}==
<syntaxhighlight lang="eiffel">
class
Line 1,399:
end
</syntaxhighlight>
TEST:
<syntaxhighlight lang="eiffel">
class
APPLICATION
Line 1,442:
end
</syntaxhighlight>
{{out}}
<pre>
Line 1,453:
=={{header|Elena}}==
ELENA 4.x :
<
import system'routines;
Line 1,489:
console.printLine("before:", list.asEnumerable());
console.printLine("after :", list.countingSort().asEnumerable())
}</
{{out}}
<pre>
Line 1,498:
=={{header|Elixir}}==
{{works with|Elixir|1.1}}
<
def counting_sort([]), do: []
def counting_sort(list) do
Line 1,511:
end
IO.inspect Sort.counting_sort([1,-2,-3,2,1,-5,5,5,4,5,9])</
{{out}}
Line 1,521:
{{works with|Fortran|95 and later}}
<
implicit none
Line 1,563:
end subroutine counting_sort_mm
end module CountingSort</
Testing:
<
use CountingSort
implicit none
Line 1,583:
write(*,'(I4)') ages
end program test</
=={{header|FreeBASIC}}==
<
Function findMax(array() As Integer) As Integer
Line 1,644:
Print
Print "Press any key to quit"
Sleep</
{{out}}
Line 1,654:
=={{header|Go}}==
This version follows the task pseudocode above, with one more optimization.
<
import (
Line 1,698:
}
}
}</
This version follows the WP pseudocode. It can be adapted to sort items other than integers.
<
import (
Line 1,749:
}
copy(a, output)
}</
=={{header|Groovy}}==
Solution:
<
def max = array.max()
def min = array.min()
Line 1,760:
array.each { count[it] ++ }
(min..max).findAll{ count[it] }.collect{ [it]*count[it] }.flatten()
}</
Test:
<
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,769:
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])</
Output:
Line 1,781:
We use lists for input and output rather than arrays, since lists are used more often in Haskell.
<
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</
=={{header|Haxe}}==
{{trans|C}}
<
public static function sort(arr:Array<Int>) {
var min = arr[0], max = arr[0];
Line 1,821:
Sys.println('Sorted Integers: ' + integerArray);
}
}</
{{out}}
Line 1,832:
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).
<
write("Sorting Demo using ",image(countingsort))
writes(" on list : ")
Line 1,854:
every put(X := [],( 1 to T[i := lower to upper], i) ) # reconstitute with correct order and count
return X
end</
Note: This example relies on [[Sorting_algorithms/Bubble_sort#Icon| the supporting procedures 'display sort', and 'writex' from Bubble Sort]].
Line 1,864:
=={{header|Io}}==
{{trans|Java}}
<
countingSort := method(min, max,
count := list() setSize(max - min + 1) mapInPlace(0)
Line 1,887:
l := list(2, 3, -4, 5, 1)
l countingSortInPlace println # ==> list(-4, 1, 2, 3, 5)</
A more functional-like version:
<
fill := method(x, size,
/* Resizes list to a given size and fills it with a given value. */
Line 1,912:
l := list(2, 3, -4, 5, 1)
l countingSortInPlace println # ==> list(-4, 1, 2, 3, 5)</
=={{header|IS-BASIC}}==
<syntaxhighlight lang="is-basic">
100 PROGRAM "CountSrt.bas"
110 RANDOMIZE
Line 1,962:
540 LOOP
550 NEXT
560 END DEF</
=={{header|J}}==
{{eff note|J|/:~}}
<
min =. <./y
cnt =. 0 $~ 1+(>./y)-min
Line 1,973:
end.
cnt # min+i.#cnt
)</
Alternative implementation:
<
'''Example:'''
<
_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</
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:
<
(m+i.n-m) (+/@(=/)~ # [) ]
)</
or
<
(+/@(=/) # ])&(m+i.n-m)
)</
Example:
<
_3 _2 _2 _1 _1 _1 0 1 1 3 3 4 4 4 4 4 5 5 6 6</
=={{header|Java}}==
{{works with|Java|1.5+}}
<
int[] count= new int[max - min + 1];
for(int number : array){
Line 2,019:
}
}
}</
=={{header|JavaScript}}==
<
var i, z = 0, count = [];
Line 2,040:
}
}</
Testing:
<
var i, ages = [];
Line 2,056:
for (i = 0; i < 100; i++) {
document.write(ages[i] + "<br />");
}</
=={{header|jq}}==
Line 2,065:
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.
<
. as $in
| reduce range(0;length) as $i
Line 2,079:
else reduce range(0; $hash[$s]) as $j (.; . + [$i])
end
);</
'''Example''':
<
{{out}}
<syntaxhighlight lang="sh">
$ jq -M -c -n -f counting_sort.jq
[0,1,1,2,4,10]</
=={{header|Julia}}==
Line 2,091:
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.
<
lo, hi = extrema(a)
b = zeros(a)
Line 2,110:
println("# unsorted bytes: $v\n -> sorted bytes: $(countsort(v))")
v = rand(1:2 ^ 10, 20)
println("# unsorted integers: $v\n -> sorted integers: $(countsort(v))")</
{{out}}
Line 2,119:
=={{header|Kotlin}}==
<
fun countingSort(array: IntArray) {
Line 2,140:
countingSort(array)
println("Sorted : ${array.asList()}")
}</
{{out}}
Line 2,152:
Prior to 0.10, multi-variable declaration/assignment would use parentheses around variable names and values.
<
val .min, .max = minmax(.array)
var .count = arr .max-.min+1, 0
Line 2,162:
writeln "Original: ", .data
writeln "Sorted : ", .countingSort(.data)</
{{out}}
Line 2,169:
=={{header|Lua}}==
<
local min, max = math.min( unpack(f) ), math.max( unpack(f) )
local count = {}
Line 2,198:
for i in next, f do
print( f[i] )
end</
=={{header|M4}}==
<
define(`randSeed',141592653)
Line 2,236:
show(`a')
countingsort(`a',0,99)
show(`a')</
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<
minElem = Min[list]; maxElem = Max[list];
count = ConstantArray[0, (maxElem - minElem + 1)];
Line 2,250:
count[[i - minElem + 1]] = count[[i - minElem + 1]] - 1;]
];
]</
<pre>countingSort@{2, 3, 1, 5, 7, 6}
->{1, 2, 3, 5, 6, 7}</pre>
Line 2,257:
This is a direct translation of the pseudo-code, except to compensate for MATLAB using 1 based arrays.
<
minElem = min(list);
Line 2,278:
end
end %countingSort</
Sample Usage:
<
ans =
1 2 3 4 5 6</
=={{header|MAXScript}}==
<syntaxhighlight lang="maxscript">
fn countingSort arr =
(
Line 2,311:
)
return arr
)</
{{out}}
<syntaxhighlight 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>
=={{header|Modula-3}}==
<
IMPORT IO, Fmt;
Line 2,361:
END;
IO.Put("\n");
END Counting.</
Output:
<pre>
Line 2,370:
=={{header|Nanoquery}}==
{{trans|Java}}
<
count = {0} * (max - min + 1)
Line 2,385:
end
end
end</
=={{header|NetRexx}}==
===Version 1===
An almost direct implementation of the pseudocode.
<
options replace format comments java crossref savelog symbols binary
Line 2,459:
return array
</syntaxhighlight>
{{out}}
<pre style="overflow: scroll;">
Line 2,468:
===Version 2===
A more Rexx-like (and shorter) version. Due to NetRexx's built in indexed string capability, negative values are also easily supported.
<
options replace format comments java crossref symbols nobinary
Line 2,518:
return
</syntaxhighlight>
{{out}}
<pre>
Line 2,526:
=={{header|Nim}}==
<
let range = max - min + 1
var count = newSeq[T](range)
Line 2,540:
var a = @[5, 3, 1, 7, 4, 1, 1, 20]
countingSort(a, 1, 20)
echo a</
Output:
<pre>@[1, 1, 1, 3, 4, 5, 7, 20]</pre>
=={{header|Objeck}}==
<
bundle Default {
class Cocktail {
Line 2,576:
}
}
</syntaxhighlight>
=={{header|OCaml}}==
For arrays:
<
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))</
=={{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>)
<
r = arr;
z = 1;
Line 2,596:
endwhile
endfor
endfunction</
Testing:
<
sorted = counting_sort(ages, 0, 140);
disp(sorted);</
=={{header|Oz}}==
Using arrays as in the original algorithm. The implementation is slightly simpler because arrays can start with an arbitrary index in Oz.
<
proc {CountingSort Arr Min Max}
Count = {Array.new Min Max 0}
Line 2,629:
in
{CountingSort A 1 9}
{Show {Array.toRecord unit A}}</
Using lists for input and output and a dictionary as a sparse array:
<
fun {CountingSort Xs}
Count = {Dictionary.new}
Line 2,652:
end
in
{Show {CountingSort [3 1 4 1 5 9 2 6 5]}}</
=={{header|PARI/GP}}==
<
my(u=vector(#v),i=0);
for(n=mn,mx,
Line 2,661:
);
u
};</
=={{header|Pascal}}==
<
procedure counting_sort(var arr : Array of Integer; n, min, max : Integer);
Line 2,695:
for i := 0 to 99 do
writeln(ages[i]);
end.</
=={{header|Perl}}==
<
use strict;
Line 2,711:
my $i = $min;
@$a = map {($i++) x $_} @cnt;
}</
Testing:
<
counting_sort(\@ages, 0, 140);
print join("\n", @ages), "\n";</
=={{header|Phix}}==
<!--<
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
Line 2,742:
<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>
<!--</
{{out}}
<pre>
Line 2,750:
=={{header|PHP}}==
<
function counting_sort(&$arr, $min, $max)
Line 2,770:
}
}
}</
Testing:
<
for($i=0; $i < 100; $i++) {
array_push($ages, rand(0, 140));
Line 2,783:
echo $ages[$i] . "\n";
}
?></
=={{header|PicoLisp}}==
<
(let Count (need (- Max Min -1) 0)
(for N Lst
Line 2,795:
(do (car C) (link (car I))) )
Count
(range Min Max) ) ) ) )</
Output:
Line 2,802:
=={{header|PL/I}}==
<
declare A(*) fixed;
declare (min, max) fixed;
Line 2,830:
end;
end;
end count_sort;</
=={{header|PowerShell}}==
<syntaxhighlight lang="powershell">
function countingSort($array) {
$minmax = $array | Measure-Object -Minimum -Maximum
Line 2,855:
"$array"
"$(countingSort $array)"
</syntaxhighlight>
<b>Output:</b>
<pre>
Line 2,863:
=={{header|PureBasic}}==
<
Define i, j
Dim c(max - min)
Line 2,878:
Wend
Next
EndProcedure</
=={{header|Python}}==
Follows the spirit of the counting sort but uses Pythons defaultdict(int) to initialize array accesses to zero, and list concatenation:
<
>>> def countingSort(array, mn, mx):
count = defaultdict(int)
Line 2,895:
>>> mini,maxi = 1,10
>>> countingSort(data, mini, maxi) == sorted(data)
True</
Using a list:
{{works with|Python|2.6}}
<
cnt = [0] * (max - min + 1)
for x in a:
Line 2,905:
return [x for x, n in enumerate(cnt, start=min)
for i in xrange(n)]</
=={{header|Quackery}}==
<
unrot poke ] is [1+] ( [ n --> [ )
Line 2,929:
dup say "Before: " echo cr
10 19 csort
say "After: " echo</
{{out}}
Line 2,938:
=={{header|R}}==
{{trans|Octave}}
<
r <- arr
z <- 1
Line 2,957:
ages <- floor(runif(100, 0, 140+1))
sorted <- counting_sort(ages, 0, 140)
print(sorted)</
=={{header|Racket}}==
<
#lang racket
Line 2,973:
(counting-sort (vector 0 9 3 8 1 -1 1 2 3 7 4) -1 10)
</syntaxhighlight>
Output:
<
'#(-1 0 1 1 2 3 3 4 7 8 9)
</syntaxhighlight>
=={{header|Raku}}==
(formerly Perl 6)
{{Works with|rakudo|2018.03}}
<syntaxhighlight lang="raku"
my $off = @ints.min;
(my @counts)[$_ - $off]++ for @ints;
Line 2,994:
say @ages.sort;
say @ages.&counting-sort.join eq @ages.sort.join ?? 'ok' !! 'not ok';</
{{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 3,006:
Negative, zero, and positive integers are supported.
===version 1===
<
$= '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.*/
Line 3,023:
return
/*──────────────────────────────────────────────────────────────────────────────────────*/
show: do s=1 for #; say right("element",20) right(s,w) arg(1) right(@.s,m); end; return</
{{out|output|text= when using the default input:}}
Line 3,122:
{{trans|PL/I}}
<
* 13.07.2014 Walter Pachl translated from PL/I
*--------------------------------------------------------------------*/
Line 3,164:
End
Say ol
Return</
'''Output:'''
<pre>before count_sort
Line 3,172:
=={{header|Ring}}==
<
aList = [4, 65, 2, 99, 83, 782, 1]
see countingSort(aList, 1, 782)
Line 3,195:
next
return f
</syntaxhighlight>
=={{header|Ruby}}==
<
def counting_sort!
replace counting_sort
Line 3,218:
# => [-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]</
=={{header|Rust}}==
<
mut data: Vec<usize>,
min: usize,
Line 3,255:
let arr3 = vec![10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
println!("{:?}", counting_sort(arr3, 0, 10));
}</
{{out}}
<pre>
Line 3,264:
=={{header|Scala}}==
<
input.foldLeft(Array.fill(max - min + 1)(0)) { (arr, n) =>
arr(n - min) += 1
Line 3,270:
}.zipWithIndex.foldLeft(List[Int]()) {
case (lst, (cnt, ndx)) => List.fill(cnt)(ndx + min) ::: lst
}.reverse</
It's better (i.e. slightly faster) to reverse the frequencies list before processing it, instead of the whole result
<
input.foldLeft(Array.fill(max - min + 1)(0)) { (arr, n) =>
arr(n - min) += 1
Line 3,279:
}.zipWithIndex.reverse.foldLeft(List[Int]()) {
case (lst, (cnt, ndx)) => List.fill(cnt)(ndx + min) ::: lst
}</
=={{header|Sidef}}==
<
var cnt = ([0] * (max - min + 1))
a.each {|i| cnt[i-min]++ }
Line 3,289:
var a = 100.of { 100.irand }
say counting_sort(a, 0, 100)</
=={{header|Slate}}==
<
[| counts index |
min `defaultsTo: (s reduce: #min: `er).
Line 3,308:
].
s
].</
=={{header|Smalltalk}}==
{{works with|GNU Smalltalk}}
<
countingSortWithMin: min andMax: max [
|oc z|
Line 3,329:
]
]
].</
Testing:
<
ages := OrderedCollection new.
Line 3,342:
ages countingSortWithMin: 0 andMax: 140.
ages printNl.</
=={{header|Tcl}}==
{{works with|Tcl|8.5}}
<
# If either of min or max weren't given, compute them now
if {$min eq ""} {
Line 3,386:
for {set i 0} {$i < 50} {incr i} {lappend a [expr {1+ int(rand()*10)}]}
puts $a
puts [countingsort $a]</
<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,392:
=={{header|VBA}}==
{{trans|Phix}}<
Private Function countingSort(array_ As Variant, mina As Long, maxa As Long) As Variant
Dim count() As Integer
Line 3,412:
s = [{5, 3, 1, 7, 4, 1, 1, 20}]
Debug.Print Join(countingSort(s, WorksheetFunction.Min(s), WorksheetFunction.Max(s)), ", ")
End Sub</
<pre>1, 1, 1, 3, 4, 5, 7, 20</pre>
Line 3,419:
=====Implementation=====
<
dim num
dim max
Line 3,460:
next
countingSort = a
end function</
=====Invocation=====
<
a = array(300, 1, -2, 3, -4, 5, -6, 7, -8, 100, 11 )
wscript.echo join( a, ", " )
countingSort a
wscript.echo join( a, ", " )</
=====Output=====
Line 3,476:
=={{header|Vlang}}==
<
println('Input: ' + arr.str())
mut count := [0].repeat(max - min + 1)
Line 3,499:
mut arr := [6, 2, 1, 7, 6, 8]
counting_sort(mut arr, 1, 8)
}</
{{out}}
<pre>Input: [6, 2, 1, 7, 6, 8]
Line 3,505:
=={{header|Wren}}==
<
var count = List.filled(max - min + 1, 0)
for (n in a) count[n - min] = count[n - min] + 1
Line 3,523:
var max = a.reduce { |max, i| (i > max) ? i : max }
countingSort.call(a, min, max)
System.print("Sorted : %(a)")</
{{out}}
Line 3,532:
=={{header|XPL0}}==
<
proc CountingSort(Array, Min, Max, Size); \Sort Array
Line 3,554:
CountingSort(A, -5, 9, 10);
for I:= 0 to 10-1 do [IntOut(0, A(I)); ChOut(0, ^ )];
]</
{{out}}
Line 3,562:
=={{header|zkl}}==
<
count:=(max - min + 1).pump(List().write,0); // array of (max - min + 1) zeros
foreach number in (array){
Line 3,572:
}
array
}</
<
countingSort(array,(0).min(array), (0).max(array)).println();</
{{out}}
<pre>L(-31,0,1,2,2,4,65,83,99,182)</pre>
|