Some of Sunday's edits have been lost. The edits from Saturday that were reverted have been restored. Site is now hosted on prgmr.com. Thank you for your patience. This notice will be removed one week from posting. --Michael Mol 18:12, 7 March 2010 (UTC)

Sort an integer array

From Rosetta Code

Jump to: navigation, search
Sort an integer array is a programming task. Visitors like you are encouraged to solve it according to the task description, using any language they may happen to know.
Add to BlogMarksAdd to del.icio.usAdd to diggAdd to NewsvineAdd to redditAdd to Slashdot
Sort an array (or list) of integers in ascending numerical order. Use a sorting facility provided by the language/library if possible.

Contents

[edit] 4D

[edit] 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

[edit] 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

[edit] Ada

Works with: GNAT version GPL 2006

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;

[edit] ALGOL 68

Translation of: python

Works with: ALGOL 68 version Standard - no extensions to language used Works with: ALGOL 68G version Any - tested with release mk15-0.8b.fc9.i386 Works with: ELLA ALGOL 68 version Any (with appropriate job cards) - tested with release 1.8.8d.fc9.i386

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))

Output:

         +1         +2         +2         +3         +4

[edit] APL

Works with: APL2

      X←63 92 51 92 39 15 43 89 36 69
X[⍋X]
15 36 39 43 51 63 69 89 92 92

[edit] AutoHotkey

numbers = 5 4 1 2 3
sort, numbers, N D%A_Space%
Msgbox % numbers

[edit] C

Works with: gcc version 4.0.1

#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);
}

[edit] C++

Works with: g++ version 4.0.1

[edit] Simple Array

#include <algorithm>
 
int main()
{
int nums[] = {2,4,3,1,2};
std::sort(nums, nums+5);
}

[edit] 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());
}

[edit] 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();
}

[edit] C#

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);
}
}

[edit] 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}


[edit] Clojure

(sort [5 4 3 2 1]) ; sort can also take a comparator function
(1 2 3 4 5)

[edit] 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)

[edit] D

auto nums = [2,4,3,1,2];
auto snums = nums.dup.sort; // Sort
nums.sort; // Sort in-place

[edit] E

[2,4,3,1,2].sort()

[edit] Erlang

List = [2, 4, 3, 1, 2].
SortedList = lists:sort(List).

[edit] Factor

{ 1 4 9 2 3 0 5 } natural-sort .

[edit] Forth

Works with: Win32Forth version 4.2

create test-data 2 , 4 , 3 , 1 , 2 ,
test-data 5 cell-sort

[edit] Fortran

Works with: Silverfrost FTN95

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.

[edit] Groovy

println ([2,4,0,3,1,2,-12].sort())

Output:

[-12, 0, 1, 2, 2, 3, 4]

[edit] Haskell

Works with: GHCi version 6.6

nums = [2,4,3,1,2] :: [Int]
sorted = List.sort nums

[edit] IDL

result = array[sort(array)]

[edit] 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.

[edit] Java

[edit] Array

import java.util.Arrays;
 
public class example {
public static void main(String[] args)
{
int[] nums = {2,4,3,1,2};
Arrays.sort(nums);
}
}

[edit] List

Works with: Java version 1.5+

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);
}
}

[edit] JavaScript

Works with: Firefox version 2.0

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 );

[edit] Lua

 
t = {4, 5, 2}
table.sort(t)
print(unpack(t))

[edit] Mathematica

numbers = Sort[{2,4,3,1,2}]

[edit] MATLAB

a = [4,3,7,-2,9,1]; b = sort(a)     % b contains elements of a in ascending order
[b,idx] = sort(a) % b contains a(idx)

[edit] MAXScript

arr = #(5, 4, 3, 2, 1)
arr = sort arr

[edit] Modula-3

Modula-3 provides a generic ArraySort module, as well as an instance of that module for integers called IntArraySort.

MODULE ArraySort EXPORTS Main;
 
IMPORT IntArraySort;
 
VAR arr := ARRAY [1..10] OF INTEGER{3, 6, 1, 2, 10, 7, 9, 4, 8, 5};
 
BEGIN
IntArraySort.Sort(arr);
END ArraySort.

[edit] Nial

sort >= 9 6 8 7 1 10
= 10 9 8 7 6 1

[edit] Objective-C

Works with: GCC version 4.0.1 (apple)

- (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:)];
}

[edit] OCaml

[edit] Array

let nums = [|2; 4; 3; 1; 2|]
Array.sort compare nums

[edit] List

let nums = [2; 4; 3; 1; 2]
let sorted = List.sort compare nums

[edit] Octave

The variable v can be a vector or a matrix (columns will be sorted).

sortedv = sort(v);

[edit] Oz

declare
Nums = [2 4 3 1 2]
Sorted = {List.sort Nums Value.'<'}
in
{Show Sorted}

[edit] Perl

Works with: Perl version 5.8.6

@nums = (2,4,3,1,2);
@sorted = sort {$a <=> $b} @nums;

[edit] Perl 6

Works with: Rakudo version #23 "Lisbon"

If @a contains only numbers:

my @sorted = sort @a;

If some elements of @a are strings or are otherwise non-numeric but you want to treat them as numbers:

my @sorted = sort +*, @a;

For an in-place sort:

@a .= sort;

[edit] PHP

Works with: PHP version 4.4.4 CLI

<?php
$nums = array(2,4,3,1,2);
sort($nums);
?>

[edit] PicoLisp

The sort function in PicoLisp returns already by default an ascending list (of any type, not only integers):

(sort (2 4 3 1 2))
-> (1 2 2 3 4)

[edit] PL/I

Works with: IBM PL/I version 7.5

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;

[edit] 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;

[edit] PowerShell

34,12,23,56,1,129,4,2,73 | Sort-Object

[edit] PureBasic

Dim numbers(20)
For i = 0 To 20
numbers(i) = Random(1000)
Next
 
SortArray(numbers(), #PB_Sort_Ascending)

[edit] Python

Works with: Python version 2.3

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])

[edit] R

nums <- c(2,4,3,1,2)
sorted <- sort(nums)

[edit] Raven

Sort list in place:

[ 2 4 3 1 2 ] sort

[edit] Ruby

Works with: Ruby version 1.8.4

nums = [2,4,3,1,2]
sorted = nums.sort # returns a new sorted array. 'nums' is unchanged
nums.sort! # sort 'nums' "in-place"

[edit] Seed7

var array integer: nums is [] (2, 4, 3, 1, 2);
 
nums := sort(nums);

[edit] Slate

 #(7 5 2 9 0 -1) sort

[edit] Smalltalk

 #(7 5 2 9 0 -1) asSortedCollection

[edit] Standard ML

[edit] Array

Works with: SML/NJ

val nums = Array.fromList [2, 4, 3, 1, 2];
ArrayQSort.sort Int.compare nums;

[edit] List

Works with: SML/NJ

val nums = [2, 4, 3, 1, 2];
val sorted = ListMergeSort.sort (op >) nums;

[edit] Tcl

set result [lsort -integer $unsorted_list]

[edit] TI-83 BASIC

Store input into L1, run prgmSORTBTIN, and L2 will be L1, only sorted.

:L1→L2
:SortA(L2)

SortA is found via: [LIST] → ENTER. SortD is also available for a descending sort.

[edit] 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.

[edit] UNIX Shell

nums=(2 4 3 1 2)
sorted=($(for i in ${nums[*]}; do echo $i; done | sort -n))

Another way:

nums=(2 4 3 1 5)
sorted=($(echo "${nums[@]}" | tr ' ' '\12' | sort -n))

[edit] Ursala

using the built in sort operator, -<, with the nleq library function for comparing natural numbers

#import nat
 
#cast %nL
 
example = nleq-< <39,47,40,53,14,23,88,52,78,62,41,92,88,66,5,40>

output:

<5,14,23,39,40,40,41,47,52,53,62,66,78,88,88,92>
Personal tools
Google AdSense