Sort an integer array

Revision as of 15:49, 5 June 2009 by rosettacode>Briantrice (Typo fix)

Sort an array (or list) of integers in ascending numerical order. Use a sorting facility provided by the language/library if possible.

Task
Sort an integer array
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

Works with: GNAT version GPL 2006

<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

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

<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

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

AutoHotkey

<lang AutoHotkey> numbers = 5 4 1 2 3 sort, numbers, N D%A_Space% Msgbox % numbers </lang>

C

Works with: gcc version 4.0.1

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

Works with: g++ version 4.0.1

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

Works with: Win32Forth version 4.2
create test-data 2 , 4 , 3 , 1 , 2 ,
test-data 5 cell-sort

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. 


Groovy

<lang groovy>println ([2,4,0,3,1,2,-12].sort())</lang>

Output:

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

Haskell

Works with: GHCi version 6.6
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

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

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

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

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

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

Works with: Perl version 5.8.6
@nums = (2,4,3,1,2);
@sorted = sort {$a <=> $b} @nums;

PHP

Works with: PHP version 4.4.4 CLI
<?php
$nums = array(2,4,3,1,2);
sort($nums);
?>

PL/I

Works with: IBM PL/I version 7.5

<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

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


R

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

Raven

Sort list in place:

[ 2 4 3 1 2 ] sort

Ruby

Works with: Ruby version 1.8.4
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

Works with: SML/NJ
val nums = Array.fromList [2, 4, 3, 1, 2];
ArrayQSort.sort Int.compare nums;

List

Works with: SML/NJ
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))