Sort an integer array
Sort an array (or list) of integers in ascending numerical order. Use a sorting facility provided by the language/library if possible.
You are encouraged to solve this task according to the task description, using any language you may know.
4D
English
ARRAY INTEGER($nums;0) APPEND TO ARRAY($nums;2) APPEND TO ARRAY($nums;4) APPEND TO ARRAY($nums;3) APPEND TO ARRAY($nums;1) APPEND TO ARRAY($nums;2) SORT ARRAY($nums) ` sort in ascending order SORT ARRAY($nums;<) ` sort in descending order
Français
TABLEAU ENTIER($nombres;0) AJOUTER A TABLEAU($nombres;2) AJOUTER A TABLEAU($nombres;4) AJOUTER A TABLEAU($nombres;3) AJOUTER A TABLEAU($nombres;1) AJOUTER A TABLEAU($nombres;2) TRIER TABLEAU($nombres) ` pour effectuer un tri par ordre croissant TRIER TABLEAU($nombres;<) ` pour effectuer un tri par ordre décroissant
Ada
<lang ada>
with Gnat.Heap_Sort_G; procedure Integer_Sort is -- Heap sort package requires data to be in index values starting at -- 1 while index value 0 is used as temporary storage type Int_Array is array(Natural range <>) of Integer; Values : Int_Array := (0,1,8,2,7,3,6,4,5); -- define move and less than subprograms for use by the heap sort package procedure Move_Int(From : Natural; To : Natural) is begin Values(To) := Values(From); end Move_Int; function Lt_Int(Left, Right : Natural) return Boolean is begin return Values(Left) < Values (Right); end Lt_Int; -- Instantiate the generic heap sort package package Heap_Sort is new Gnat.Heap_Sort_G(Move_Int, Lt_Int); begin Heap_Sort.Sort(8); end Integer_Sort;
requires an Ada05 compiler, e.g GNAT GPL 2007
with Ada.Containers.Generic_Array_Sort; procedure Integer_Sort is -- type Int_Array is array(Natural range <>) of Integer; Values : Int_Array := (0,1,8,2,7,3,6,4,5); -- Instantiate the generic sort package from the standard Ada library procedure Sort is new Ada.Containers.Generic_Array_Sort (Index_Type => Natural; Element_Type => Integer; Array_Type => Int_Array); begin Sort(Values); end Integer_Sort;
</lang>
ALGOL 68
<lang algol>CO PR READ "shell_sort.a68" PR CO MODE TYPE = INT;
PROC in place shell sort = (REF[]TYPE seq)REF[]TYPE:(
INT inc := ( UPB seq + LWB seq + 1 ) OVER 2; WHILE inc NE 0 DO FOR index FROM LWB seq TO UPB seq DO INT i := index; TYPE el = seq[i]; WHILE ( i - LWB seq >= inc | seq[i - inc] > el | FALSE ) DO seq[i] := seq[i - inc]; i -:= inc OD; seq[i] := el OD; inc := IF inc = 2 THEN 1 ELSE ENTIER(inc * 5 / 11) FI OD; seq
);
PROC shell sort = ([]TYPE seq)[]TYPE:
in place shell sort(LOC[LWB seq: UPB seq]TYPE:=seq);
print((shell sort((2, 4, 3, 1, 2)), new line))</lang> Output:
+1 +2 +2 +3 +4
APL
X←63 92 51 92 39 15 43 89 36 69 X[⍋X] 15 36 39 43 51 63 69 89 92 92
AutoHotkey
<lang AutoHotkey> numbers = 5 4 1 2 3 sort, numbers, N D%A_Space% Msgbox % numbers </lang>
C
<lang c> #include <stdlib.h>
int intcmp(const void *a, const void *b) { return *(int *)a - *(int *)b; } int main() { int nums[5] = {2,4,3,1,2}; qsort(nums, 5, sizeof(int), intcmp); }</lang>
C++
Simple Array
#include <algorithm> int main() { int nums[] = {2,4,3,1,2}; std::sort(nums, nums+5); }
std::vector
#include <algorithm> #include <vector> int main() { std::vector<int> nums; nums.push_back(2); nums.push_back(4); nums.push_back(3); nums.push_back(1); nums.push_back(2); std::sort(nums.begin(), nums.end()); }
std::list
#include <list> int main() { std::list<int> nums; nums.push_back(2); nums.push_back(4); nums.push_back(3); nums.push_back(1); nums.push_back(2); nums.sort(); }
C#
<lang csharp>using System; using System.Collections.Generic;
public class Program {
static void Main() { int[] unsorted = new int[] { 6, 2, 7, 8, 3, 1, 10, 5, 4, 9 }; Array.Sort(unsorted); }
}</lang>
Clean
We use list and array comprehensions to convert an array to and from a list in order to use the built-in sort on lists.
import StdEnv sortArray :: (a e) -> a e | Array a e & Ord e sortArray array = {y \\ y <- sort [x \\ x <-: array]} Start :: {#Int} Start = sortArray {2, 4, 3, 1, 2}
Common Lisp
In Common Lisp, the sort function takes a predicate that is used as the comparator. This parameter can be any two-argument function. To sort a sequence (list or array) of integers, call sort with the < operator as the predicate:
CL-USER> (sort #(9 -2 1 2 8 0 1 2) #'<) #(-2 0 1 1 2 2 8 9)
D
auto nums = [2,4,3,1,2]; auto snums = nums.dup.sort; // Sort nums.sort; // Sort in-place
E
[2,4,3,1,2].sort()
Erlang
List = [2, 4, 3, 1, 2]. SortedList = lists:sort(List).
Forth
create test-data 2 , 4 , 3 , 1 , 2 , test-data 5 cell-sort
Fortran
CALL ISORT@(b, a, n) ! n = number of elements ! a = array to be sorted ! b = array of indices of a. b(1) 'points' to the minimum value etc.
Groovy
<lang groovy>println ([2,4,0,3,1,2,-12].sort())</lang>
Output:
[-12, 0, 1, 2, 2, 3, 4]
Haskell
nums = [2,4,3,1,2] :: [Int] sorted = List.sort nums
IDL
result = array[sort(array)]
J
/:~
The verb /:~ sorts anything. For example:
] a=: 10 ?@$ 100 NB. random vector 63 92 51 92 39 15 43 89 36 69 /:~ a 15 36 39 43 51 63 69 89 92 92
Arrays of any rank are treated as lists of component arrays. Thus /:~ sorts not only atoms within a list, but whole lists within a table, tables within a three-axis array, and so on. The level of structure at which sorting occurs may also be specified, so that /:~"1 sorts the atoms within the finest-grained list within the array, regardless of the overall rank of the array.
This code also applies to any data type.
Java
Array
import java.util.Arrays; public class example { public static void main(String[] args) { int[] nums = {2,4,3,1,2}; Arrays.sort(nums); } }
List
import java.util.Arrays; import java.util.Collections; import java.util.List; public class example { public static void main(String[] args) { List<Integer> nums = Arrays.asList(2,4,3,1,2); Collections.sort(nums); } }
JavaScript
JavaScript sorts lexically by default, so "10000" comes before "2". To sort numerically, a custom comparator is used.
function numberSorter(a, b) { return a - b; } var numbers = [20, 7, 65, 10, 3, 0, 8, -60]; numbers.sort(numberSorter); alert( numbers );
Mathematica
numbers = Sort[{2,4,3,1,2}]
MAXScript
arr = #(5, 4, 3, 2, 1) arr = sort arr
Nial
sort >= 9 6 8 7 1 10 = 10 9 8 7 6 1
Objective-C
- (void)example { NSArray *nums, *sorted; nums = [NSArray arrayWithObjects: [NSNumber numberWithInt:2], [NSNumber numberWithInt:4], [NSNumber numberWithInt:3], [NSNumber numberWithInt:1], [NSNumber numberWithInt:2], nil]; sorted = [nums sortedArrayUsingSelector:@selector(compare:)]; }
OCaml
Array
let nums = [|2; 4; 3; 1; 2|] Array.sort compare nums
List
let nums = [2; 4; 3; 1; 2] let sorted = List.sort compare nums
Octave
The variable v can be a vector or a matrix (columns will be sorted).
<lang octave>sortedv = sort(v);</lang>
Perl
@nums = (2,4,3,1,2); @sorted = sort {$a <=> $b} @nums;
PHP
<?php $nums = array(2,4,3,1,2); sort($nums); ?>
PL/I
<lang PL/I>
DCL (T(10)) FIXED BIN(31); /* scratch space of length N/2 */ MERGE: PROCEDURE (A,LA,B,LB,C); DECLARE (A(*),B(*),C(*)) FIXED BIN(31); DECLARE (LA,LB) FIXED BIN(31) NONASGN; DECLARE (I,J,K) FIXED BIN(31); I=1; J=1; K=1; DO WHILE ((I <= LA) & (J <= LB)); IF(A(I) <= B(J)) THEN DO; C(K)=A(I); K=K+1; I=I+1; END; ELSE DO; C(K)=B(J); K=K+1; J=J+1; END; END; DO WHILE (I <= LA); C(K)=A(I); I=I+1; K=K+1; END; RETURN; END MERGE; MERGESORT: PROCEDURE (A,N) RECURSIVE ; DECLARE (A(*)) FIXED BINARY(31); DECLARE N FIXED BINARY(31) NONASGN; DECLARE Temp FIXED BINARY; DECLARE (M,I) FIXED BINARY; DECLARE AMP1(N) FIXED BINARY(31) BASED(P); DECLARE P POINTER;
IF (N=1) THEN RETURN; M = trunc((N+1)/2); IF (M>1) THEN CALL MERGESORT(A,M); P=ADDR(A(M+1)); IF (N-M > 1) THEN CALL MERGESORT(AMP1,N-M); IF A(M) <= AMP1(1) THEN RETURN; DO I=1 to M; T(I)=A(I); END; CALL MERGE(T,M,AMP1,N-M,A); RETURN; END MERGESORT;
</lang>
Pop11
Pop11 library function sorts lists. So we first convert array to list, then sort and finally convert back:
lvars ar = {2 4 3 1 2}; ;;; Convert array to list. ;;; destvector leaves its results and on the pop11 stack + an integer saying how many there were destvector(ar); ;;; conslist uses the items left on the stack plus the integer, to make a list of those items. lvars ls = conslist(); ;;; Sort it sort(ls) -> ls; ;;; Convert list to array destlist(ls); consvector() -> ar;
The above can be abbreviated to more economical, but possibly more opaque, syntax, using pop11 as a functional language:
lvars ar = {2 4 3 1 2}; consvector(destlist(sort(conslist(destvector(ar))))) -> ar; ;;; print the sorted vector: ar => ** {1 2 2 3 4}
(The list created by conslist will be garbage-collected.)
Alternatively, using the datalist function, even more economically:
lvars ar = {2 4 3 1 2}; consvector(destlist(sort(datalist(ar)))) -> ar;
or in Forth-like pop11 postfix syntax:
lvars ar = {2 4 3 1 2}; ar.datalist.sort.destlist.consvector -> ar;
Python
nums = [2,4,3,1,2] nums.sort()
Note: The array nums is sorted in place.
Interpreter: Python 2.4 (and above)
You could also use the built-in sorted() function
nums = sorted([2,4,3,1,2])
R
nums <- (2,4,3,1,2) sorted <- sort(nums)
Raven
Sort list in place:
[ 2 4 3 1 2 ] sort
Ruby
nums = [2,4,3,1,2] sorted = nums.sort
Seed7
var array integer: nums is [] (2, 4, 3, 1, 2);
nums := sort(nums);
Slate
<lang slate> #(7 5 2 9 0 -1) sort</lang>
Smalltalk
<lang smalltalk> #(7 5 2 9 0 -1) asSortedCollection</lang>
Standard ML
Array
val nums = Array.fromList [2, 4, 3, 1, 2]; ArrayQSort.sort Int.compare nums;
List
val nums = [2, 4, 3, 1, 2]; val sorted = ListMergeSort.sort (op >) nums;
Tcl
<lang tcl>set result [lsort -integer $unsorted_list]</lang>
Toka
This can be done by using the bubble sort library:
needs bsort arrayname number_elements bsort
See the Toka entry on Bubble Sort for a full example.
UNIX Shell
Bourne Again SHell
nums=(2 4 3 1 2) sorted=($(for i in ${nums[*]}; do echo $i; done | sort -n))