Sorting algorithms/Insertion sort: Difference between revisions

m
 
(35 intermediate revisions by 20 users not shown)
Line 34:
{{trans|Python}}
 
<langsyntaxhighlight lang="11l">F insertion_sort(&l)
L(i) 1 .< l.len
V j = i - 1
Line 45:
V arr = [7, 6, 5, 9, 8, 4, 3, 1, 2, 0]
insertion_sort(&arr)
print(arr)</langsyntaxhighlight>
 
{{out}}
Line 56:
These programs use two ASSIST macros (XDECO, XPRNT) to keep the code as short as possible.
===Basic===
<langsyntaxhighlight lang="360asm">* Insertion sort 16/06/2016
INSSORT CSECT
USING INSSORT,R13 base register
Line 112:
XDEC DS CL12 for xdeco
YREGS symbolics for registers
END INSSORT</langsyntaxhighlight>
{{out}}
<pre>
Line 120:
===Assembler Structured Macros===
No harmful gotos [:)Dijkstra], no labels. It's cleaner, but is it clearer?
<langsyntaxhighlight lang="360asm">* Insertion sort 16/06/2016
INSSORTS CSECT
USING INSSORTS,R13 base register
Line 172:
XDEC DS CL12 for xdeco
YREGS symbolics for registers
END INSSORTS</langsyntaxhighlight>
{{out}}
Same as previous
 
=={{header|AArch64 Assembly}}==
<syntaxhighlight lang="asm">
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
.section .text
<lang AArch64 Assembly>
.globl insertion_sort
 
// C equivalent at bottom
/* void insertion_sort(int *arr, size_t len);
* X0: pointer to &a[0]
* X1: index of one past the last element of arr
* Preconditions:
* - Arg 1 (X0) is not a null pointer
* - Arg 2 (X1) is not zero
*/
#define ARR_BEGIN x0
#define ARR_END x2
#define I x3
#define J x4
#define OUTER_TMP w6
#define INNER_TMP w5
insertion_sort:
add ARR_END, ARR_BEGIN, x1, LSL #2
add I, ARR_BEGIN, #4
b 2f
// goto test;
// do {
0:
ldr OUTER_TMP, [I] // OUTER_TMP = *I;
 
// int INNER_TMP, *J;
// for (J = I; J != &arr[0] && (INNER_TMP = J[-1]) > OUTER_TMP; J--)
// *J = INNER_TMP;
mov J, I
b 3f
1:
// Loop body
str INNER_TMP, [J], #-4
3:
// Loop test
cmp J, ARR_BEGIN
b.eq 1f
ldr INNER_TMP, [J, #-4]
cmp INNER_TMP, OUTER_TMP
b.gt 1b
1:
str OUTER_TMP, [J] // *J = OUTER_TMP
add I, I, #4
// test:; } while (I < &arr[len]);
2:
cmp I, ARR_END
b.lo 0b
ret
 
/*
// First I wrote this C code, then I hand-compiled it to the above assembly.
void insertion_sort(int arr[], size_t len) {
int x, *pi, *pj;
for (pi = &a[1]; pi != &arr[len]; pi++) {
x = *pi;
for (pj = pi; pj != &a[0] && pj[-1] > x; pj--)
*pj = pj[-1];
*pj = x;
}
}
*/
 
</syntaxhighlight>{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program insertionSort64.s */
Line 340 ⟶ 404:
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"
</syntaxhighlight>
</lang>
=={{header|ACL2}}==
<langsyntaxhighlight Lisplang="lisp">(defun insert (x xs)
(cond ((endp xs) (list x))
((< x (first xs))
Line 353 ⟶ 417:
nil
(insert (first xs)
(isort (rest xs)))))</langsyntaxhighlight>
 
=={{header|Action!}}==
<langsyntaxhighlight Actionlang="action!">PROC PrintArray(INT ARRAY a INT size)
INT i
 
Line 407 ⟶ 471:
Test(c,8)
Test(d,12)
RETURN</langsyntaxhighlight>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Insertion_sort.png Screenshot from Atari 8-bit computer]
Line 433 ⟶ 497:
 
=={{header|ActionScript}}==
<langsyntaxhighlight ActionScriptlang="actionscript">function insertionSort(array:Array)
{
for(var i:int = 1; i < array.length;i++)
Line 447 ⟶ 511:
}
return array;
}</langsyntaxhighlight>
 
=={{header|Ada}}==
<langsyntaxhighlight lang="ada">type Data_Array is array(Natural range <>) of Integer;
procedure Insertion_Sort(Item : in out Data_Array) is
Line 467 ⟶ 531:
Item(J + 1) := Value;
end loop;
end Insertion_Sort;</langsyntaxhighlight>
 
=={{header|ALGOL 68}}==
Line 477 ⟶ 541:
 
{{works with|ELLA ALGOL 68|Any (with appropriate job cards) - tested with release [http://sourceforge.net/projects/algol68/files/algol68toc/algol68toc-1.8.8d/algol68toc-1.8-8d.fc9.i386.rpm/download 1.8-8d]}}
<langsyntaxhighlight lang="algol68">MODE DATA = REF CHAR;
 
PROC in place insertion sort = (REF[]DATA item)VOID:
Line 501 ⟶ 565:
in place insertion sort(ref data);
FOR i TO UPB ref data DO print(ref data[i]) OD; print(new line);
print((data))</langsyntaxhighlight>
{{out}}
<pre>
Line 510 ⟶ 574:
=={{header|ALGOL W}}==
External in-place insertion sort routine for integers. From the pseudo code but with variable bounds.
<langsyntaxhighlight lang="algolw">% insertion sorts in-place the array A. As Algol W procedures can't find the bounds %
% of an array parameter, the lower and upper bounds must be specified in lb and ub %
procedure insertionSortI ( integer array A ( * ); integer value lb, ub ) ;
Line 522 ⟶ 586:
end while_j_ge_0_and_Aj_gt_v ;
A( j + 1 ) := v
end insertionSortI ;</langsyntaxhighlight>
Test the insertionSortI procedure.
<langsyntaxhighlight lang="algolw">begin
% external in-place insertion sort procedure %
procedure insertionSortI ( integer array A( * ); integer value lb, ub ) ;
Line 539 ⟶ 603:
write( i_w := 1, d( 1 ) );
for i := 2 until 8 do writeon( i_w := 1, d( i ) )
end.</langsyntaxhighlight>
{{out}}
<pre>
Line 547 ⟶ 611:
=={{header|AppleScript}}==
 
<langsyntaxhighlight lang="applescript">-- In-place insertion sort
on insertionSort(theList, l, r) -- Sort items l thru r of theList.
set listLength to (count theList)
Line 599 ⟶ 663:
set aList to {60, 73, 11, 66, 6, 77, 41, 97, 59, 45, 64, 15, 91, 100, 22, 89, 77, 59, 54, 61}
sort(aList, 1, -1) -- Sort items 1 thru -1 of aList.
return aList</langsyntaxhighlight>
 
{{output}}
<langsyntaxhighlight lang="applescript">{6, 11, 15, 22, 41, 45, 54, 59, 59, 60, 61, 64, 66, 73, 77, 77, 89, 91, 97, 100}</langsyntaxhighlight>
 
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
<lang ARM Assembly>
/* ARM assembly Raspberry PI */
/* program insertionSort.s */
Line 830 ⟶ 894:
bx lr @ leave function
iMagicNumber: .int 0xCCCCCCCD
</syntaxhighlight>
</lang>
 
=={{header|Arturo}}==
 
<langsyntaxhighlight lang="rebol">insertionSort: function [items][
arr: new items
loop 1..(size items)-1 'i [
Line 851 ⟶ 915:
]
 
print insertionSort [3 1 2 8 5 7 9 4 6]</langsyntaxhighlight>
 
{{out}}
Line 863 ⟶ 927:
This implementation finds the position at which the element is to be inserted, and then uses '''array_subcirculate''' to move it into place. The prelude's implementation of '''array_subcirculate''' is a '''memmove(3)'''.
 
<langsyntaxhighlight ATSlang="ats">#include "share/atspre_staload.hats"
 
(*------------------------------------------------------------------*)
Line 948 ⟶ 1,012:
print! (" ", arr[i]);
println! ()
end</langsyntaxhighlight>
 
{{out}}
Sorting random numbers.
<pre>$ patscc -DATS_MEMALLOC_GCBDW -O3 insertion_sort_task_array_of_nonlinear.dats -lgc && ./a.out
3 6 7 5 3 5 6 2 9 1 2 7 0 9 3 6 0 6 2 6 1 8 7 9 2 0 2 3 7 5
0 0 0 1 1 2 2 2 2 2 3 3 3 3 5 5 5 6 6 6 6 6 7 7 7 7 8 9 9 9</pre>
 
===For arrays whose elements may be of linear type===
Line 956 ⟶ 1,026:
(The complications are necessary to prevent us accidentally having two copies of a linear value. Having two copies would introduce such nasty possibilities as a double-free error, use of a destroyed list, etc.)
 
<langsyntaxhighlight ATSlang="ats">#include "share/atspre_staload.hats"
 
(*------------------------------------------------------------------*)
Line 1,117 ⟶ 1,187:
array_uninitize<Strptr1> (arr, i2sz SIZE);
array_ptr_free (pf_arr, pfgc_arr | p_arr)
end</langsyntaxhighlight>
 
{{out}}
Sorting random numbers by their first digit, to demonstrate that the sort is stable. The numbers are stored in the array as linear strings (strings that must be explicitly freed), to demonstrate that the sort works with linear types.
<pre>$ patscc -DATS_MEMALLOC_LIBC -O3 insertion_sort_task_array_of_linear.dats && ./a.out
83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 26 40 26 72 36 11 68 67 29 82 30 62 23 67 35
15 11 21 27 26 26 29 23 35 36 30 35 49 40 59 62 63 68 67 62 67 77 72 83 86 86 82 93 92 90</pre>
 
===For linear lists whose elements may be of linear type===
 
It is useful in a language such as ATS to have a stable insertion sort that operates on singly-linked lists. Such a sort can serve as the innermost part of a list mergesort or list quicksort.
 
None of the activities in the following implementation requires allocating a new node. The original list is consumed. However, you can use this code to non-destructively sort a non-linear list by first creating a copy, casting the copy to a linear list, and sorting the copy, then casting the result to a non-linear list.
 
<syntaxhighlight lang="ats">#include "share/atspre_staload.hats"
 
(*------------------------------------------------------------------*)
(* Interface *)
 
extern fn {a : vt@ype} (* The "less than" template. *)
insertion_sort$lt : (&a, &a) -<> bool (* Arguments by reference. *)
 
extern fn {a : vt@ype}
insertion_sort
{n : int}
(lst : list_vt (a, n))
:<!wrt> list_vt (a, n)
 
(*------------------------------------------------------------------*)
(* Implementation *)
 
(* This implementation is based on the insertion-sort part of the
mergesort code of the ATS prelude.
Unlike the prelude, however, I build the sorted list in reverse
order. Building the list in reverse order actually makes the
implementation more like that for an array. *)
 
(* Some convenient shorthands. *)
#define NIL list_vt_nil ()
#define :: list_vt_cons
 
(* Inserting in reverse order minimizes the work for a list already
nearly sorted, or for stably sorting a list whose entries often
have equal keys. *)
fun {a : vt@ype}
insert_reverse
{m : nat}
{p_xnode : addr}
{p_x : addr}
{p_xs : addr}
.<m>.
(pf_x : a @ p_x,
pf_xs : list_vt (a, 0)? @ p_xs |
dst : &list_vt (a, m) >> list_vt (a, m + 1),
(* list_vt_cons_unfold is a viewtype created by the
unfolding of a list_vt_cons (our :: operator). *)
xnode : list_vt_cons_unfold (p_xnode, p_x, p_xs),
p_x : ptr p_x,
p_xs : ptr p_xs)
:<!wrt> void =
(* dst is some tail of the current (reverse-order) destination list.
xnode is a viewtype for the current node in the source list.
p_x points to the node's CAR.
p_xs points to the node's CDR. *)
case+ dst of
| @ (y :: ys) =>
if insertion_sort$lt<a> (!p_x, y) then
let (* Move to the next destination node. *)
val () = insert_reverse (pf_x, pf_xs | ys, xnode, p_x, p_xs)
prval () = fold@ dst
in
end
else
let (* Insert xnode here. *)
prval () = fold@ dst
val () = !p_xs := dst
val () = dst := xnode
prval () = fold@ dst
in
end
| ~ NIL =>
let (* Put xnode at the end. *)
val () = dst := xnode
val () = !p_xs := NIL
prval () = fold@ dst
in
end
 
implement {a}
insertion_sort {n} lst =
let
fun (* Create a list sorted in reverse. *)
loop {i : nat | i <= n}
.<n - i>.
(dst : &list_vt (a, i) >> list_vt (a, n),
src : list_vt (a, n - i))
:<!wrt> void =
case+ src of
| @ (x :: xs) =>
let
val tail = xs
in
insert_reverse<a> (view@ x, view@ xs |
dst, src, addr@ x, addr@ xs);
loop (dst, tail)
end
| ~ NIL => () (* We are done. *)
 
prval () = lemma_list_vt_param lst
 
var dst : List_vt a = NIL
in
loop (dst, lst);
 
(* Reversing a linear list is an in-place operation. *)
list_vt_reverse<a> dst
end
 
(*------------------------------------------------------------------*)
 
(* The demonstration converts random numbers to linear strings, then
sorts the elements by their first character. Thus here is a simple
demonstration that the sort can handle elements of linear type, and
also that the sort is stable. *)
 
implement
main0 () =
let
implement
insertion_sort$lt<Strptr1> (x, y) =
let
val sx = $UNSAFE.castvwtp1{string} x
and sy = $UNSAFE.castvwtp1{string} y
val cx = $effmask_all $UNSAFE.string_get_at (sx, 0)
and cy = $effmask_all $UNSAFE.string_get_at (sy, 0)
in
cx < cy
end
 
implement
list_vt_freelin$clear<Strptr1> x =
strptr_free x
 
#define SIZE 30
 
fn
create_the_list ()
:<!wrt> list_vt (Strptr1, SIZE) =
let
fun
loop {i : nat | i <= SIZE}
.<SIZE - i>.
(lst : list_vt (Strptr1, i),
i : size_t i)
:<!wrt> list_vt (Strptr1, SIZE) =
if i = i2sz SIZE then
list_vt_reverse lst
else
let
#define BUFSIZE 10
var buffer : array (char, BUFSIZE)
 
val () =
array_initize_elt<char> (buffer, i2sz BUFSIZE, '\0')
val _ = $extfcall (int, "snprintf", addr@ buffer,
i2sz BUFSIZE, "%d",
$extfcall (int, "rand") % 100)
val () = buffer[BUFSIZE - 1] := '\0'
val s = string0_copy ($UNSAFE.cast{string} buffer)
in
loop (s :: lst, succ i)
end
in
loop (NIL, i2sz 0)
end
 
var p : List string
 
val lst = create_the_list ()
 
val () =
for (p := $UNSAFE.castvwtp1{List string} lst;
isneqz p;
p := list_tail p)
print! (" ", list_head p)
val () = println! ()
 
val lst = insertion_sort<Strptr1> lst
 
val () =
for (p := $UNSAFE.castvwtp1{List string} lst;
isneqz p;
p := list_tail p)
print! (" ", list_head p)
val () = println! ()
 
val () = list_vt_freelin lst
in
end</syntaxhighlight>
 
{{out}}
Sorting random numbers by their first digit, to demonstrate that the sort is stable. The numbers are stored in the list as linear strings (strings that must be explicitly freed), to demonstrate that the sort works if the list elements themselves are linear.
<pre>$ patscc -DATS_MEMALLOC_LIBC -O3 insertion_sort_task_linear_list.dats && ./a.out
83 86 77 15 93 35 86 92 49 21 62 27 90 59 63 26 40 26 72 36 11 68 67 29 82 30 62 23 67 35
15 11 21 27 26 26 29 23 35 36 30 35 49 40 59 62 63 68 67 62 67 77 72 83 86 86 82 93 92 90</pre>
Line 1,127 ⟶ 1,396:
=={{header|AutoHotkey}}==
contributed by Laszlo on the ahk [http://www.autohotkey.com/forum/post-276481.html#276481 forum]
<langsyntaxhighlight AutoHotkeylang="autohotkey">MsgBox % InsertionSort("")
MsgBox % InsertionSort("xxx")
MsgBox % InsertionSort("3,2,1")
Line 1,143 ⟶ 1,412:
sorted .= "," . a%A_Index%
Return SubStr(sorted,2) ; drop leading comma
}</langsyntaxhighlight>
 
=={{header|AWK}}==
Sort standard input (storing lines into an array) and output to standard output
<langsyntaxhighlight lang="awk">{
line[NR] = $0
}
Line 1,164 ⟶ 1,433:
print line[i]
}
}</langsyntaxhighlight>
 
=={{header|Bash}}==
<langsyntaxhighlight lang="bash">#!/bin/bash
 
# Sorting integers with insertion sort
Line 1,247 ⟶ 1,516:
fi
 
#END</langsyntaxhighlight>
 
{{out}}
Line 1,260 ⟶ 1,529:
=={{header|B4X}}==
The array type can be changed to Object and it will then work with any numeric type.
<langsyntaxhighlight lang="b4x">Sub InsertionSort (A() As Int)
For i = 1 To A.Length - 1
Dim value As Int = A(i)
Line 1,279 ⟶ 1,548:
Next
End Sub
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,295 ⟶ 1,564:
 
This version should work on any BASIC that can accept arrays as function arguments.
<langsyntaxhighlight lang="qbasic">DECLARE SUB InsertionSort (theList() AS INTEGER)
 
DIM n(10) AS INTEGER, L AS INTEGER, o AS STRING
Line 1,324 ⟶ 1,593:
theList(j + 1) = insertionElement
NEXT
END SUB</langsyntaxhighlight>
 
{{out}}
Line 1,330 ⟶ 1,599:
1486 ; 9488 ; 9894 ; 17479 ; 18989 ; 23119 ; 23233 ; 24927 ; 25386 ; 26689 ;
</pre>
 
==={{header|GW-BASIC}}===
{{works with|BASICA}}
{{works with|QBasic}}
{{works with|QuickBASIC}}
{{works with|VB-DOS}}
 
Sorts N integers in an array a() with the Insertion sort
 
<syntaxhighlight lang="qbasic">
10 'SAVE "INSERTGW",A
20 DEFINT A-Z
30 OPTION BASE 1
40 N=20: R=100: I=0: Y=0: V=0: P=0
50 DIM A(N)
60 ' Creates the disordered array
70 CLS: PRINT "This program sorts by Insertion a list of randomly generated numbers."
80 PRINT: PRINT "Unsorted list:"
90 RANDOMIZE TIMER
100 FOR I = 1 TO N
110 A(I) = INT(RND * R) + 1
120 NEXT I
130 GOSUB 260
140 PRINT: PRINT "Sorted list."
150 ' Insertion Sort
160 FOR I=1 TO N
170 V=A(I): P=I-1: S=1
180 WHILE P>0 AND S=1
185 S=0
190 IF A(P) > V THEN A(P+1)=A(P): P=P-1: S=1
200 WEND
210 A(P+1) = V
220 NEXT I
230 GOSUB 260
240 PRINT: PRINT "End of program execution."
250 END
260 ' Print list routine
270 FOR I=1 TO N
280 PRINT A(I);
290 NEXT I
300 PRINT
310 RETURN
</syntaxhighlight>
{{out}}
<pre>This program sorts by Insertion a list of randomly generated numbers.
 
Unsorted list:
73 11 100 68 28 48 3 36 15 34 31 26 47 61 5 58 15 86 69 79
 
Sorted list:
3 5 11 15 15 26 28 31 34 36 47 48 58 61 68 69 73 79 86 100
 
End of program execution.</pre>
 
==={{header|ZX BASIC}}===
Line 1,335 ⟶ 1,657:
Sorts N elements in array i() into ascending order. Invoke with GO SUB 500.
 
<langsyntaxhighlight lang="zxbasic">500 FOR j=1 TO N-1
510 IF i(j)<=i(j+1) THEN NEXT j: RETURN
520 LET c=i(j+1)
530 FOR k=j TO 1 STEP -1: IF i(k)>c THEN LET i(k+1)=i(k): NEXT k
540 LET i(k+1)=c
600 NEXT j: RETURN</langsyntaxhighlight>
 
For those who prefer GO TOs over conditional NEXTs (fine in ZX BASIC but problematic for compilers and stack-dependent interpreters like NextBASIC’s integer extensions) replace NEXT J: RETURN in line 510 with GO TO 600 and use this line 530:
Line 1,349 ⟶ 1,671:
==={{header|BBC BASIC}}===
Note that the array index is assumed to start at zero.
<langsyntaxhighlight lang="bbcbasic"> DIM test(9)
test() = 4, 65, 2, -31, 0, 99, 2, 83, 782, 1
PROCinsertionsort(test(), 10)
Line 1,369 ⟶ 1,691:
a(j%) = t
NEXT
ENDPROC</langsyntaxhighlight>
{{out}}
<pre>
Line 1,376 ⟶ 1,698:
 
==={{header|Commodore BASIC}}===
<langsyntaxhighlight lang="basic">
10 DIM A(10): N=9
11 REM GENERATE SOME RANDOM NUMBERS AND PRINT THEM
Line 1,385 ⟶ 1,707:
32 RETURN
50 PRINT: FOR I=0 TO N: PRINTA(I): NEXT: RETURN
</syntaxhighlight>
</lang>
 
==={{header|IS-BASIC}}===
<syntaxhighlight lang IS="is-BASICbasic"> 100 PROGRAM "InserSrt.bas"
110 RANDOMIZE
120 NUMERIC ARRAY(5 TO 21)
Line 1,414 ⟶ 1,736:
340 LET A(I+1)=SW
350 NEXT
360 END DEF</langsyntaxhighlight>
 
=={{header|BASIC256}}==
{{trans|FreeBASIC}}
<syntaxhighlight lang="basic">global array
dim array(15)
a = array[?,]
b = array[?]
for i = a to b-1
array[i] = int(rand * 100)
next i
 
print "unsort ";
for i = a to b-1
print rjust(array[i], 4);
next i
 
call insertionSort(array) # ordenar el array
 
print chr(10); " sort ";
for i = a to b-1
print rjust(array[i], 4);
next i
end
 
subroutine insertionSort(array)
lb = array[?,]
 
for i = lb + 1 to array[?]-1
valor = array[i]
j = i - 1
while j >= lb and array[j] > valor
array[j +1] = array[j]
j -= 1
end while
 
array[j+1] = valor
next i
end subroutine</syntaxhighlight>
 
=={{header|BCPL}}==
<langsyntaxhighlight lang="bcpl">get "libhdr"
 
let insertionSort(A, len) be
Line 1,442 ⟶ 1,802:
insertionSort(array, length)
write("After: ", array, length)
$)</langsyntaxhighlight>
{{out}}
<pre>Before: 4 65 2 -31 0 99 2 83 782 1
After: -31 0 1 2 2 4 65 83 99 782</pre>
 
=={{header|Binary Lambda Calculus}}==
 
As documented at https://github.com/tromp/AIT/blob/master/lists/sort.lam, the 55 byte BLC program
 
<pre>15 46 84 06 05 46 81 60 15 fb ec 2f 80 01 5b f9 7f 0b 7e f7 2f ec 2d fb 80 56 05 fd 85 bb 76 11 5d 50 5c 00 8b f3 ff 04 af fe 60 de 57 ff 30 5d 81 ff c2 dd 9a 28 20</pre>
 
sorts a list of bitstrings, such as integers of a fixed bit-width, lexicographically.
 
=={{header|C}}==
<langsyntaxhighlight lang="c">#include <stdio.h>
 
void insertion_sort(int*, const size_t);
Line 1,480 ⟶ 1,848:
return 0;
}
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 1,488 ⟶ 1,856:
 
=={{header|C sharp|C#}}==
<langsyntaxhighlight lang="csharp">namespace Sort {
using System;
 
Line 1,508 ⟶ 1,876:
}
}
}</langsyntaxhighlight>
'''Example''':
<langsyntaxhighlight lang="csharp"> using Sort;
using System;
 
Line 1,519 ⟶ 1,887:
Console.WriteLine(String.Join(" ", entries));
}
}</langsyntaxhighlight>
 
=={{header|C++}}==
Line 1,525 ⟶ 1,893:
g++ -std=c++11 insertion.cpp
Uses binary search via std::upper_bound() to find the insertion position in logarithmic time and then performs the insertion via std::rotate() in linear time.
<langsyntaxhighlight lang="cpp">#include <algorithm>
#include <iostream>
#include <iterator>
Line 1,557 ⟶ 1,925:
std::cout << "\n";
}</langsyntaxhighlight>
{{out}}
<pre>
Line 1,564 ⟶ 1,932:
 
=={{header|Clojure}}==
<langsyntaxhighlight lang="clojure">
(defn insertion-sort [coll]
(reduce (fn [result input]
Line 1,571 ⟶ 1,939:
[]
coll))
</syntaxhighlight>
</lang>
 
Translated from the Haskell example:
<langsyntaxhighlight lang="clojure">
(defn in-sort! [data]
(letfn [(insert ([raw x](insert [] raw x))
Line 1,583 ⟶ 1,951:
(reduce insert [] data)))
;Usage:(in-sort! [6,8,5,9,3,2,1,4,7])
;Returns: [1 2 3 4 5 6 7 8 9]</langsyntaxhighlight>
 
=={{header|CLU}}==
<langsyntaxhighlight lang="clu">% Insertion-sort an array in place.
insertion_sort = proc [T: type] (a: array[T])
where T has lt: proctype (T,T) returns (bool)
Line 1,621 ⟶ 1,989:
insertion_sort[int](test)
stream$puts(po, "After: ") print_arr[int](test, 3, po)
end start_up</langsyntaxhighlight>
{{out}}
<pre>Before: 7 -5 0 2 99 16 4 20 47 19
Line 1,627 ⟶ 1,995:
 
=={{header|CMake}}==
<langsyntaxhighlight lang="cmake"># insertion_sort(var [value1 value2...]) sorts a list of integers.
function(insertion_sort var)
math(EXPR last "${ARGC} - 1") # Sort ARGV[1..last].
Line 1,657 ⟶ 2,025:
endforeach(i)
set("${var}" "${answer}" PARENT_SCOPE)
endfunction(insertion_sort)</langsyntaxhighlight>
 
<langsyntaxhighlight lang="cmake">insertion_sort(result 33 11 44 22 66 55)
message(STATUS "${result}") # -- 11;22;33;44;55;66</langsyntaxhighlight>
 
=={{header|COBOL}}==
This exerpt contains just enough of the procedure division to show the sort itself. The appropriate data division entries can be inferred. See also the entry for the Bubble sort for a full program.
<langsyntaxhighlight COBOLlang="cobol"> C-PROCESS SECTION.
PERFORM E-INSERTION VARYING WB-IX-1 FROM 1 BY 1
UNTIL WB-IX-1 > WC-SIZE.
Line 1,690 ⟶ 2,058:
 
F-999.
EXIT.</langsyntaxhighlight>
 
And a fully runnable version, by Steve Williams
{{works with|GnuCOBOL}}
<syntaxhighlight lang="cobol">
<lang COBOL>
>>SOURCE FORMAT FREE
*> This code is dedicated to the public domain
Line 1,764 ⟶ 2,132:
stop run
.
end program insertionsort.</langsyntaxhighlight>
 
{{out}}
Line 1,773 ⟶ 2,141:
 
=={{header|Common Lisp}}==
<langsyntaxhighlight lang="lisp">(defun span (predicate list)
(let ((tail (member-if-not predicate list)))
(values (ldiff list tail) tail)))
Line 1,785 ⟶ 2,153:
 
(defun insertion-sort (list)
(reduce #'insert list :initial-value nil))</langsyntaxhighlight>
 
<langsyntaxhighlight lang="lisp">(defun insertion-sort (sequence &optional (predicate #'<))
(if (cdr sequence)
(insert (car sequence) ;; insert the current item into
Line 1,804 ⟶ 2,172:
(insert item ;; the list of the item sorted with the rest of the list
(cdr sequence)
predicate)))))</langsyntaxhighlight>
 
=={{header|Craft Basic}}==
<syntaxhighlight lang="basic">define size = 10, value = 0
 
dim list[size]
 
gosub fill
gosub sort
gosub show
 
end
 
sub fill
 
for i = 0 to size - 1
 
let list[i] = int(rnd * 100)
 
next i
 
return
 
sub sort
 
for i = 1 to size - 1
 
let value = list[i]
let j = i - 1
 
do
 
if j >= 0 and list[j] > value then
 
let p = j + 1
let list[p] = list[j]
let j = j - 1
 
endif
 
loop j >= 0 and list[j] > value
 
let p = j + 1
let list[p] = value
 
wait
 
next i
 
return
 
sub show
 
for i = 0 to size - 1
 
print i, ": ", list[i]
next i
 
return</syntaxhighlight>
 
=={{header|D}}==
<langsyntaxhighlight lang="d">void insertionSort(T)(T[] data) pure nothrow @safe @nogc {
foreach (immutable i, value; data[1 .. $]) {
auto j = i + 1;
Line 1,821 ⟶ 2,248:
items.insertionSort;
items.writeln;
}</langsyntaxhighlight>
{{out}}
<pre>[2, 4, 11, 17, 19, 24, 25, 28, 44, 46]</pre>
Line 1,827 ⟶ 2,254:
===Higher Level Version===
{{trans|C++}}
<langsyntaxhighlight lang="d">import std.stdio, std.range, std.algorithm, std.traits;
 
void insertionSort(R)(R arr)
Line 1,857 ⟶ 2,284:
assert(arr3.isSorted);
}
}</langsyntaxhighlight>
{{out}}
<pre>arr1 sorted: [2, 4, 11, 17, 19, 24, 25, 28, 44, 46]
Line 1,866 ⟶ 2,293:
{{trans|Java}}
 
<langsyntaxhighlight lang="dart">
 
insertSort(List<int> array){
Line 1,885 ⟶ 2,312:
print('${a}');
}
</syntaxhighlight>
</lang>
{{out}}
<pre>array unsorted: [10, 3, 11, 15, 19, 1];
Line 1,896 ⟶ 2,323:
 
Static array is an arbitrary-based array of fixed length
<langsyntaxhighlight Delphilang="delphi">program TestInsertionSort;
 
{$APPTYPE CONSOLE}
Line 1,945 ⟶ 2,372:
Writeln;
Readln;
end.</langsyntaxhighlight>
{{out}}
<pre>
Line 1,954 ⟶ 2,381:
===String sort===
// string is 1-based variable-length array of Char
<langsyntaxhighlight Delphilang="delphi">procedure InsertionSort(var S: string);
var
I, J, L: Integer;
Line 1,970 ⟶ 2,397:
S[J + 1]:= Ch;
end;
end;</langsyntaxhighlight>
<pre>
// in : S = 'the quick brown fox jumps over the lazy dog'
Line 1,980 ⟶ 2,407:
A direct conversion of the pseudocode.
 
<langsyntaxhighlight lang="e">def insertionSort(array) {
for i in 1..!(array.size()) {
def value := array[i]
Line 1,990 ⟶ 2,417:
array[j+1] := value
}
}</langsyntaxhighlight>
 
Test case:
 
<langsyntaxhighlight lang="e">? def a := [71, 53, 22, 24, 83, 54, 39, 78, 65, 26, 60, 75, 67, 27, 52, 59, 93, 62, 85, 99, 88, 10, 91, 85, 13, 17, 14, 96, 55, 10, 61, 94, 27, 50, 75, 40, 47, 63, 10, 23].diverge()
> insertionSort(a)
> a
# value: [10, 10, 10, 13, 14, 17, 22, 23, 24, 26, 27, 27, 39, 40, 47, 50, 52, 53, 54, 55, 59, 60, 61, 62, 63, 65, 67, 71, 75, 75, 78, 83, 85, 85, 88, 91, 93, 94, 96, 99].diverge()</langsyntaxhighlight>
 
=={{header|EasyLang}}==
 
<syntaxhighlight lang="text">
<lang>subr sort
proc sort . d[] .
for i = 1 to len data[] - 1
for hi = data2 to len d[i]
j = ih -= 1d[i]
while j >= 0i and- h < data[j]1
data[while j +>= 1] =and h < datad[j]
d[j -=+ 1] = d[j]
. j -= 1
data[j + 1] = h.
d[j + 1] = h
.
.
.
data[] = [ 29 4 72 44 55 26 27 77 92 5 ]
call sort data[]
print data[]</lang>
</syntaxhighlight>
 
=={{header|Eiffel}}==
Line 2,023 ⟶ 2,452:
For a more complete explanation of the Eiffel sort examples, see the [[Sorting algorithms/Bubble sort#Eiffel|Bubble sort]].
 
<langsyntaxhighlight lang="eiffel">class
MY_SORTED_SET [G -> COMPARABLE]
inherit
Line 2,054 ⟶ 2,483:
end
 
end</langsyntaxhighlight>
 
=={{header|Elena}}==
ELENA 56.0x :
<langsyntaxhighlight lang="elena">import extensions;
extension op
Line 2,067 ⟶ 2,496:
insertionSort(int first, int last)
{
for(int i := first + 1,; i <= last,; i += 1)
{
var entry := self[i];
Line 2,090 ⟶ 2,519:
console.printLine("before:", list.asEnumerable());
console.printLine("after :", list.insertionSort().asEnumerable());
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,098 ⟶ 2,527:
 
=={{header|Elixir}}==
<langsyntaxhighlight lang="elixir">defmodule Sort do
def insert_sort(list) when is_list(list), do: insert_sort(list, [])
Line 2,107 ⟶ 2,536:
defp insert(x, sorted) when x < hd(sorted), do: [x | sorted]
defp insert(x, [h | t]), do: [h | insert(x, t)]
end</langsyntaxhighlight>
 
Example:
Line 2,116 ⟶ 2,545:
 
=={{header|Emacs Lisp}}==
<langsyntaxhighlight lang="lisp">(defun min-or-max-of-a-list (numbers comparator)
"Return minimum or maximum of NUMBERS using COMPARATOR."
(let ((extremum (car numbers)))
Line 2,145 ⟶ 2,574:
nil))
 
(insertion-sort '(1 2 3 9 8 7 25 12 3 2 1) #'>)</langsyntaxhighlight>
 
{{out}}
 
(25 12 9 8 7 3 3 2 2 1 1)
 
=={{header|EMal}}==
<syntaxhighlight lang="emal">
fun insertionSort = void by List a # sort list in place
for int i = 1; i < a.length; ++i
var v = a[i]
int j
for j = i - 1; j >= 0 and a[j] > v; --j
a[j + 1] = a[j]
end
a[j + 1] = v
end
end
List lists = List[ # a list of lists
int[4, 65, 2, -31, 0, 99, 83, 782, 1],
real[5.17, 2, 5.12],
text["this", "is", "insertion", "sort"]]
for each List list in lists
writeLine("Before: " + text!list) # list as text
insertionSort(list)
writeLine("After : " + text!list)
writeLine()
end
</syntaxhighlight>
{{out}}
<pre>
Before: [4,65,2,-31,0,99,83,782,1]
After : [-31,0,1,2,4,65,83,99,782]
 
Before: [5.17,2.0,5.12]
After : [2.0,5.12,5.17]
 
Before: [this,is,insertion,sort]
After : [insertion,is,sort,this]
</pre>
 
=={{header|Erlang}}==
<langsyntaxhighlight Erlanglang="erlang">-module(sort).
-export([insertion/1]).
 
Line 2,159 ⟶ 2,623:
insert(X,[]) -> [X];
insert(X,L=[H|_]) when X =< H -> [X|L];
insert(X,[H|T]) -> [H|insert(X, T)].</langsyntaxhighlight>
 
And the calls:
<langsyntaxhighlight lang="erlang">1> c(sort).
{ok,sort}
2> sort:insertion([5,3,9,4,1,6,8,2,7]).
[1,2,3,4,5,6,7,8,9]</langsyntaxhighlight>
 
=={{header|ERRE}}==
Note: array index is assumed to start at zero.
<syntaxhighlight lang="erre">
<lang ERRE>
PROGRAM INSERTION_SORT
 
Line 2,203 ⟶ 2,667:
PRINT
END PROGRAM
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 2,211 ⟶ 2,675:
 
=={{header|Euphoria}}==
<langsyntaxhighlight lang="euphoria">function insertion_sort(sequence s)
object temp
integer j
Line 2,232 ⟶ 2,696:
pretty_print(1,s,{2})
puts(1,"\nAfter: ")
pretty_print(1,insertion_sort(s),{2})</langsyntaxhighlight>
 
{{out}}
Line 2,270 ⟶ 2,734:
=={{header|F Sharp|F#}}==
Procedural Version
<langsyntaxhighlight lang="fsharp">
// This function performs an insertion sort with an array.
// The input parameter is a generic array (any type that can perform comparison).
Line 2,285 ⟶ 2,749:
B.[j+1] <- value
B // the array B is returned
</syntaxhighlight>
</lang>
 
Functional Version
<langsyntaxhighlight lang="fsharp">
let insertionSort collection =
 
Line 2,304 ⟶ 2,768:
| x::xs, ys -> xs |> isort (sinsert x ys)
collection |> isort []
</syntaxhighlight>
</lang>
 
=={{header|Factor}}==
{{trans|Haskell}}
<langsyntaxhighlight lang="factor">USING: kernel prettyprint sorting.extras sequences ;
 
: insertion-sort ( seq -- sorted-seq )
<reversed> V{ } clone [ swap insort-left! ] reduce ;
 
{ 6 8 5 9 3 2 1 4 7 } insertion-sort .</langsyntaxhighlight>
{{out}}
<pre>
Line 2,322 ⟶ 2,786:
 
=={{header|Forth}}==
<langsyntaxhighlight lang="forth">: insert ( start end -- start )
dup @ >r ( r: v ) \ v = a[i]
begin
Line 2,339 ⟶ 2,803:
create test 7 , 3 , 0 , 2 , 9 , 1 , 6 , 8 , 4 , 5 ,
test 10 sort
test 10 cells dump</langsyntaxhighlight>
 
=={{header|Fortran}}==
{{works with|Fortran|90 and later}}
 
<langsyntaxhighlight lang="fortran">subroutine sort(n, a)
implicit none
integer :: n, i, j
Line 2,359 ⟶ 2,823:
a(j + 1) = x
end do
end subroutine</langsyntaxhighlight>
 
=== Alternate Fortran 77 version ===
<langsyntaxhighlight lang="fortran"> SUBROUTINE SORT(N,A)
IMPLICIT NONE
INTEGER N,I,J
Line 2,376 ⟶ 2,840:
20 A(J + 1) = X
30 CONTINUE
END</langsyntaxhighlight>
 
=={{header|FreeBASIC}}==
<langsyntaxhighlight lang="freebasic">' version 20-10-2016
' compile with: fbc -s console
' for boundry checks on array's compile with: fbc -s console -exx
Line 2,428 ⟶ 2,892:
Print : Print "hit any key to end program"
Sleep
End</langsyntaxhighlight>
{{out}}
<pre>unsort -7 -1 4 -6 5 2 1 -2 0 -5 -4 6 -3 7 3
Line 2,434 ⟶ 2,898:
 
=={{header|GAP}}==
<langsyntaxhighlight lang="gap">InsertionSort := function(L)
local n, i, j, x;
n := Length(L);
Line 2,451 ⟶ 2,915:
InsertionSort(s);
s;
# "ABCDEFGHIJKLMNOPQRSTUVWXYZ"</langsyntaxhighlight>
 
=={{header|Go}}==
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 2,476 ⟶ 2,940:
insertionSort(list)
fmt.Println("sorted! ", list)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,484 ⟶ 2,948:
 
A generic version that takes any container that conforms to <code>sort.Interface</code>:
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,505 ⟶ 2,969:
insertionSort(sort.IntSlice(list))
fmt.Println("sorted! ", list)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,513 ⟶ 2,977:
 
Using binary search to locate the place to insert:
<langsyntaxhighlight lang="go">package main
 
import (
Line 2,535 ⟶ 2,999:
insertionSort(list)
fmt.Println("sorted! ", list)
}</langsyntaxhighlight>
{{out}}
<pre>
Line 2,544 ⟶ 3,008:
=={{header|Groovy}}==
Solution:
<langsyntaxhighlight lang="groovy">def insertionSort = { list ->
def size = list.size()
Line 2,556 ⟶ 3,020:
}
list
}</langsyntaxhighlight>
 
Test:
<langsyntaxhighlight lang="groovy">println (insertionSort([23,76,99,58,97,57,35,89,51,38,95,92,24,46,31,24,14,12,57,78,4]))
println (insertionSort([88,18,31,44,4,0,8,81,14,78,20,76,84,33,73,75,82,5,62,70,12,7,1]))</langsyntaxhighlight>
 
{{out}}
Line 2,567 ⟶ 3,031:
 
=={{header|Haskell}}==
<langsyntaxhighlight lang="haskell">import Data.List (insert)
 
insertionSort :: Ord a => [a] -> [a]
Line 2,574 ⟶ 3,038:
-- Example use:
-- *Main> insertionSort [6,8,5,9,3,2,1,4,7]
-- [1,2,3,4,5,6,7,8,9]</langsyntaxhighlight>
 
=={{header|Haxe}}==
<langsyntaxhighlight lang="haxe">class InsertionSort {
@:generic
public static function sort<T>(arr:Array<T>) {
Line 2,609 ⟶ 3,073:
Sys.println('Sorted Strings: ' + stringArray);
}
}</langsyntaxhighlight>
 
{{out}}
Line 2,622 ⟶ 3,086:
 
=={{header|HicEst}}==
<langsyntaxhighlight lang="hicest">DO i = 2, LEN(A)
value = A(i)
j = i - 1
Line 2,633 ⟶ 3,097:
ENDIF
A(j+1) = value
ENDDO</langsyntaxhighlight>
 
=={{header|Icon}} and {{header|Unicon}}==
<langsyntaxhighlight Iconlang="icon">procedure main() #: demonstrate various ways to sort a list and string
demosort(insertionsort,[3, 14, 1, 5, 9, 2, 6, 3],"qwerty")
end
Line 2,652 ⟶ 3,116:
}
return X
end</langsyntaxhighlight>
 
Note: This example relies on [[Sorting_algorithms/Bubble_sort#Icon| the supporting procedures 'sortop', and 'demosort' in Bubble Sort]]. The full demosort exercises the named sort of a list with op = "numeric", "string", ">>" (lexically gt, descending),">" (numerically gt, descending), a custom comparator, and also a string.
Line 2,666 ⟶ 3,130:
=={{header|Io}}==
 
<syntaxhighlight lang="io">
<lang io>
List do(
insertionSortInPlace := method(
Line 2,683 ⟶ 3,147:
 
lst := list(7, 6, 5, 9, 8, 4, 3, 1, 2, 0)
lst insertionSortInPlace println # ==> list(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)</langsyntaxhighlight>
 
A shorter, but slightly less efficient, version:
<langsyntaxhighlight lang="io">List do(
insertionSortInPlace := method(
# In fact, we could've done slice(1, size - 1) foreach(...)
Line 2,699 ⟶ 3,163:
lst := list(7, 6, 5, 9, 8, 4, 3, 1, 2, 0)
lst insertionSortInPlace println # ==> list(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
</syntaxhighlight>
</lang>
 
=={{header|Isabelle}}==
<langsyntaxhighlight Isabellelang="isabelle">theory Insertionsort
imports Main
begin
Line 2,759 ⟶ 3,223:
unfolding rosettacode_haskell_insertionsort_def by(induction xs) simp+
 
end</langsyntaxhighlight>
 
 
Line 2,765 ⟶ 3,229:
{{eff note|J|/:~}}
Solution inspired by the Common LISP solution:
<langsyntaxhighlight Jlang="j">isort=:((>: # ]) , [ , < #])/</langsyntaxhighlight>
Example of use:
<langsyntaxhighlight Jlang="j"> isort 32 4 1 34 95 3 2 120 _38
_38 1 2 3 4 32 34 95 120</langsyntaxhighlight>
 
=={{header|Java}}==
<langsyntaxhighlight lang="java5">public static void insertSort(int[] A){
for(int i = 1; i < A.length; i++){
int value = A[i];
Line 2,781 ⟶ 3,245:
A[j + 1] = value;
}
}</langsyntaxhighlight>
 
Using some built-in algorithms (warning: not stable, due to the lack of an "upper bound" binary search function)
{{trans|C++}}
<langsyntaxhighlight lang="java5">public static <E extends Comparable<? super E>> void insertionSort(List<E> a) {
for (int i = 1; i < a.size(); i++) {
int j = Math.abs(Collections.binarySearch(a.subList(0, i), a.get(i)) + 1);
Line 2,798 ⟶ 3,262:
a[j] = x;
}
}</langsyntaxhighlight>
 
=={{header|JavaScript}}==
<langsyntaxhighlight lang="javascript">
function insertionSort (a) {
for (var i = 0; i < a.length; i++) {
Line 2,814 ⟶ 3,278:
var a = [4, 65, 2, -31, 0, 99, 83, 782, 1];
insertionSort(a);
document.write(a.join(" "));</langsyntaxhighlight>
 
=={{header|jq}}==
{{works with|jq|1.4}}
The insertion sort can be expressed directly in jq as follows:
<langsyntaxhighlight lang="jq">def insertion_sort:
reduce .[] as $x ([]; insert($x));</langsyntaxhighlight>where insert/1 inserts its argument into its input, which can, by construction, be assumed here to be sorted. This algorithm will work in jq for any JSON array.
 
The following solution uses an "industrial strength" implementation of bsearch (binary search) that requires the following control structure:
<langsyntaxhighlight lang="jq"># As soon as "condition" is true, then emit . and stop:
def do_until(condition; next):
def u: if condition then . else (next|u) end;
u;</langsyntaxhighlight>
 
bsearch is the only non-trivial part of this solution, and so we include
Line 2,835 ⟶ 3,299:
(-1 - ix), where ix is the insertion point that would leave the array sorted.
 
If the input is not sorted, bsearch will terminate but with irrelevant results.<langsyntaxhighlight lang="jq">def bsearch(target):
if length == 0 then -1
elif length == 1 then
Line 2,872 ⟶ 3,336:
 
def insertion_sort:
reduce .[] as $x ([]; insert($x));</langsyntaxhighlight>
Example:<langsyntaxhighlight lang="jq">[1, 2, 1, 1.1, -1.1, null, [null], {"null":null}] | insertion_sort</langsyntaxhighlight>
{{Out}}
[null,-1.1,1,1,1.1,2,[null],{"null":null}]
 
=={{header|Julia}}==
<langsyntaxhighlight lang="julia"># v0.6
 
function insertionsort!(A::Array{T}) where T <: Number
Line 2,894 ⟶ 3,358:
 
x = randn(5)
@show x insertionsort!(x)</langsyntaxhighlight>
 
{{out}}
Line 2,901 ⟶ 3,365:
 
=={{header|Kotlin}}==
<langsyntaxhighlight lang="kotlin">fun insertionSort(array: IntArray) {
for (index in 1 until array.size) {
val value = array[index]
Line 2,927 ⟶ 3,391:
insertionSort(numbers)
printArray("Sorted:", numbers)
}</langsyntaxhighlight>
 
{{out}}
Line 2,934 ⟶ 3,398:
 
=={{header|Ksh}}==
<langsyntaxhighlight lang="ksh">#!/bin/ksh
 
# An insertion sort in ksh
Line 2,972 ⟶ 3,436:
printf "%d " ${arr[i]}
done
printf "%s\n" " )"</langsyntaxhighlight>
 
{{out}}
Line 2,978 ⟶ 3,442:
 
=={{header|Lambdatalk}}==
<langsyntaxhighlight lang="scheme">
{def sort
 
Line 3,004 ⟶ 3,468:
{sort {A}}
-> [-31,0,1,2,4,65,83,99,782]
</syntaxhighlight>
</lang>
 
=={{header|Liberty BASIC}}==
<langsyntaxhighlight lang="lb"> itemCount = 20
dim A(itemCount)
for i = 1 to itemCount
Line 3,037 ⟶ 3,501:
next i
print
return</langsyntaxhighlight>
 
=={{header|Lua}}==
Binary variation of Insertion sort (Has better complexity)
<langsyntaxhighlight lang="lua">do
local function lower_bound(container, container_begin, container_end, value, comparator)
local count = container_end - container_begin + 1
Line 3,086 ⟶ 3,550:
binary_insertion_sort_impl(container, comparator)
end
end</langsyntaxhighlight>
 
<langsyntaxhighlight lang="lua">function bins(tb, val, st, en)
local st, en = st or 1, en or #tb
local mid = math.floor((st + en)/2)
Line 3,103 ⟶ 3,567:
end
 
print(unpack(isort{4,5,2,7,8,3}))</langsyntaxhighlight>
 
=={{header|Maple}}==
<langsyntaxhighlight Maplelang="maple">arr := Array([17,3,72,0,36,2,3,8,40,0]):
len := numelems(arr):
for i from 2 to len do
Line 3,117 ⟶ 3,581:
arr[j+1] := val:
end do:
arr;</langsyntaxhighlight>
{{Out|Output}}
<pre>[0,0,2,3,3,8,17,36,40,72]</pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<langsyntaxhighlight Mathematicalang="mathematica">insertionSort[a_List] := Module[{A = a},
For[i = 2, i <= Length[A], i++,
value = A[[i]]; j = i - 1;
Line 3,128 ⟶ 3,592:
A[[j + 1]] = value;];
A
]</langsyntaxhighlight>
{{out}}
<pre>insertionSort@{ 2, 1, 3, 5}
Line 3,135 ⟶ 3,599:
=={{header|MATLAB}} / {{header|Octave}}==
This is a direct translation of the pseudo-code above, except that it has been modified to compensate for MATLAB's 1 based arrays.
<langsyntaxhighlight MATLABlang="matlab">function list = insertionSort(list)
 
for i = (2:numel(list))
Line 3,150 ⟶ 3,614:
end %for
end %insertionSort</langsyntaxhighlight>
 
Sample Usage:
<langsyntaxhighlight MATLABlang="matlab">>> insertionSort([4 3 1 5 6 2])
 
ans =
 
1 2 3 4 5 6</langsyntaxhighlight>
 
=={{header|Maxima}}==
<langsyntaxhighlight lang="maxima">insertion_sort(u) := block(
[n: length(u), x, j],
for i from 2 thru n do (
Line 3,171 ⟶ 3,635:
u[j + 1]: x
)
)$</langsyntaxhighlight>
 
=={{header|MAXScript}}==
<syntaxhighlight lang="maxscript">
<lang MAXScript>
fn inSort arr =
(
Line 3,189 ⟶ 3,653:
return arr
)
</syntaxhighlight>
</lang>
Output:
<syntaxhighlight lang="maxscript">
<lang MAXScript>
b = for i in 1 to 20 collect random 1 40
#(2, 28, 35, 31, 27, 24, 2, 22, 15, 34, 9, 10, 22, 40, 26, 5, 23, 6, 18, 33)
a = insort b
#(2, 2, 5, 6, 9, 10, 15, 18, 22, 22, 23, 24, 26, 27, 28, 31, 33, 34, 35, 40)
</syntaxhighlight>
</lang>
 
=={{header|Miranda}}==
<syntaxhighlight lang="miranda">main :: [sys_message]
main = [Stdout ("Before: " ++ show testlist ++ "\n"),
Stdout ("After: " ++ show (insertionsort testlist) ++ "\n")]
where testlist = [4,65,2,-31,0,99,2,83,782,1]
 
 
insertionsort :: [*]->[*]
insertionsort = foldr insert []
 
insert :: *->[*]->[*]
insert x [] = [x]
insert x (y:ys) = x:y:ys, if x<y
= y:insert x ys, otherwise</syntaxhighlight>
{{out}}
<pre>Before: [4,65,2,-31,0,99,2,83,782,1]
After: [-31,0,1,2,2,4,65,83,99,782]</pre>
 
=={{header|ML}}==
==={{header|mLite}}===
{{trans|OCaml}}
<langsyntaxhighlight lang="ocaml">fun insertion_sort L =
let
fun insert
Line 3,215 ⟶ 3,697:
 
println ` insertion_sort [6,8,5,9,3,2,1,4,7];
</syntaxhighlight>
</lang>
Output
<pre>
Line 3,222 ⟶ 3,704:
 
==={{header|Standard ML}}===
<langsyntaxhighlight lang="sml">fun insertion_sort cmp = let
fun insert (x, []) = [x]
| insert (x, y::ys) =
Line 3,231 ⟶ 3,713:
end;
 
insertion_sort Int.compare [6,8,5,9,3,2,1,4,7];</langsyntaxhighlight>
 
=={{header|Modula-3}}==
{{trans|Ada}}
<langsyntaxhighlight lang="modula3">MODULE InsertSort;
 
PROCEDURE IntSort(VAR item: ARRAY OF INTEGER) =
Line 3,250 ⟶ 3,732:
END;
END IntSort;
END InsertSort.</langsyntaxhighlight>
 
=={{header|N/t/roff}}==
Line 3,257 ⟶ 3,739:
 
===Sliding method===
<langsyntaxhighlight N/t/rofflang="nroff">.de end
..
.de array
Line 3,311 ⟶ 3,793:
.a.pushln 13 64 22 87 54 87 23 92 11 64 5 9 3 3 0
.insertionsort a
.a.dump</langsyntaxhighlight>
 
===Swapping method===
<langsyntaxhighlight N/t/rofflang="nroff">.de end
..
.de array
Line 3,358 ⟶ 3,840:
.a.pushln 13 64 22 87 54 87 23 92 11 64 5 9 3 3 0
.insertionsort a
.a.dump</langsyntaxhighlight>
 
=={{header|Nanoquery}}==
{{trans|Python}}
<langsyntaxhighlight Nanoquerylang="nanoquery">def insertion_sort(L)
for i in range(1, len(L) - 1)
j = i - 1
Line 3,374 ⟶ 3,856:
 
return L
end</langsyntaxhighlight>
 
=={{header|Nemerle}}==
From the psuedocode.
<langsyntaxhighlight Nemerlelang="nemerle">using System.Console;
using Nemerle.English;
 
Line 3,404 ⟶ 3,886:
foreach (i in arr) Write($"$i ");
}
}</langsyntaxhighlight>
 
=={{header|NetRexx}}==
<langsyntaxhighlight NetRexxlang="netrexx">/* NetRexx */
options replace format comments java crossref savelog symbols binary
 
Line 3,454 ⟶ 3,936:
 
return ArrayList(A)
</syntaxhighlight>
</lang>
{{out}}
<pre>
Line 3,477 ⟶ 3,959:
 
=={{header|Nim}}==
<langsyntaxhighlight lang="nim">proc insertSort[T](a: var openarray[T]) =
for i in 1 .. a.high:
let value = a[i]
Line 3,488 ⟶ 3,970:
var a = @[4, 65, 2, -31, 0, 99, 2, 83, 782]
insertSort a
echo a</langsyntaxhighlight>
{{out}}
<pre>@[-31, 0, 2, 2, 4, 65, 83, 99, 782]</pre>
 
=={{header|Oberon-2}}==
{{trans|Modula-3}}
<syntaxhighlight lang="oberon2">MODULE InsertionSort;
 
IMPORT Out;
VAR
A1:ARRAY 10 OF INTEGER;
PROCEDURE Init;
BEGIN
A1[0] := 4; A1[1] := 65; A1[2] := 2; A1[3] := -31;
A1[4] := 0; A1[5] := 99; A1[6] := 2; A1[7] := 83;
A1[8] := 782; A1[9] := 1;
END Init;
PROCEDURE InsertionSort(VAR A:ARRAY OF INTEGER);
VAR
i,j:LONGINT;
value:INTEGER;
BEGIN
FOR i := 1 TO LEN(A)-1 DO
value := A[i];
j := i-1;
WHILE((j >= 0) & (A[j] > value)) DO A[j+1] := A[j]; DEC(j) END;
A[j+1] := value
END;
END InsertionSort;
 
PROCEDURE PrintArray(VAR A:ARRAY OF INTEGER);
VAR i:LONGINT;
BEGIN
FOR i := 0 TO LEN(A)-1 DO Out.Int(A[i],0); Out.Char(' ') END;
Out.Ln
END PrintArray;
BEGIN
Init;
PrintArray(A1);
InsertionSort(A1);
PrintArray(A1);
END InsertionSort.
</syntaxhighlight>
 
{{out}}
<pre>4 65 2 -31 0 99 2 83 782 1
-31 0 1 2 2 4 65 83 99 782
</pre>
 
=={{header|Objeck}}==
<langsyntaxhighlight lang="objeck">
bundle Default {
class Insert {
Line 3,517 ⟶ 4,048:
}
}
</syntaxhighlight>
</lang>
 
=={{header|OCaml}}==
<langsyntaxhighlight lang="ocaml">let rec insert lst x =
match lst with
| y []:: ys when x > y -> [y :: insert ys x]
| y :: ys when x <= y_ -> x :: y :: yslst
| y :: ys -> y :: insert ys x
 
let insertion_sort = List.fold_left insert []
;;
let insertion_sort = List.fold_left insert [];;
 
insertion_sortlet () = [6; 8; 5; 9; 3; 2; 1; 4; 7];;</lang>
|> insertion_sort |> List.iter (Printf.printf " %u") |> print_newline</syntaxhighlight>
{{out}}
<pre> 1 2 3 4 5 6 7 8 9</pre>
 
=={{header|Oforth}}==
Line 3,535 ⟶ 4,067:
Returns a new sorted list.
 
<langsyntaxhighlight Oforthlang="oforth">: insertionSort(a)
| l i j v |
a asListBuffer ->l
Line 3,548 ⟶ 4,080:
l put(j 1 +, v)
]
l ;</langsyntaxhighlight>
 
{{out}}
Line 3,559 ⟶ 4,091:
=={{header|ooRexx}}==
{{trans|REXX}}
<langsyntaxhighlight lang="oorexx">/* REXX program sorts a stemmed array (has characters) */
/* using the insertion sort algorithm */
Call gen /* fill the array with test data */
Line 3,601 ⟶ 4,133:
Say 'Element' right(j,length(x.0)) arg(1)":" x.j
End
Return</langsyntaxhighlight>
{{out}}
<pre>Element 1 before sort: ---Monday's Child Is Fair of Face (by Mother Goose)---
Line 3,627 ⟶ 4,159:
=={{header|Oz}}==
Direct translation of pseudocode. In-place sorting of mutable arrays.
<langsyntaxhighlight lang="oz">declare
proc {InsertionSort A}
Low = {Array.low A}
Line 3,647 ⟶ 4,179:
in
{InsertionSort Arr}
{Show {Array.toRecord unit Arr}}</langsyntaxhighlight>
 
=={{header|PARI/GP}}==
<langsyntaxhighlight lang="parigp">insertionSort(v)={
for(i=1,#v-1,
my(j=i-1,x=v[i]);
Line 3,660 ⟶ 4,192:
);
v
};</langsyntaxhighlight>
 
=={{header|Pascal}}==
{{works with|FPC}}
See [[Sorting_algorithms/Insertion_sort#Delphi | Delphi]]
<syntaxhighlight lang="pascal">
program SortDemo;
 
{$mode objfpc}{$h+}{$b-}
 
procedure InsertionSort(var A: array of Integer);
var
I, J, Tmp: Integer;
begin
for I := 1 to High(a) do
if A[I] < A[I - 1] then begin
J := I;
Tmp := A[I];
repeat
A[J] := A[J - 1];
Dec(J);
until (J = 0) or (Tmp >= A[J - 1]);
A[J] := Tmp;
end;
end;
 
procedure PrintArray(const A: array of Integer);
var
I: Integer;
begin
Write('[');
for I := 0 to High(A) - 1 do
Write(A[I], ', ');
WriteLn(A[High(A)], ']');
end;
 
var
a: array[-7..6] of Integer = (-34, -20, 30, 13, 36, -10, 5, -25, 9, 19, 35, -50, 29, 11);
 
begin
InsertionSort(a);
PrintArray(a);
end.
</syntaxhighlight>
{{out}}
<pre>
[-50, -34, -25, -20, -10, 5, 9, 11, 13, 19, 29, 30, 35, 36]
</pre>
 
=={{header|Perl}}==
<langsyntaxhighlight lang="perl">
sub insertion_sort {
my (@list) = @_;
Line 3,683 ⟶ 4,258:
my @a = insertion_sort(4, 65, 2, -31, 0, 99, 83, 782, 1);
print "@a\n";
</syntaxhighlight>
</lang>
{{out}}
-31 0 1 2 4 65 83 99 782
Line 3,689 ⟶ 4,264:
=={{header|Phix}}==
Copy of [[Sorting_algorithms/Insertion_sort#Euphoria|Euphoria]]
<!--<langsyntaxhighlight Phixlang="phix">(phixonline)-->
<span style="color: #008080;">function</span> <span style="color: #000000;">insertion_sort</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<span style="color: #004080;">object</span> <span style="color: #000000;">temp</span>
Line 3,709 ⟶ 4,284:
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"Before: "</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">s</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"After: "</span><span style="color: #0000FF;">)</span> <span style="color: #0000FF;">?</span><span style="color: #000000;">insertion_sort</span><span style="color: #0000FF;">(</span><span style="color: #000000;">s</span><span style="color: #0000FF;">)</span>
<!--</langsyntaxhighlight>-->
{{out}}
<pre>
Line 3,717 ⟶ 4,292:
 
=={{header|PHP}}==
<langsyntaxhighlight lang="php">function insertionSort(&$arr){
for($i=0;$i<count($arr);$i++){
$val = $arr[$i];
Line 3,731 ⟶ 4,306:
$arr = array(4,2,1,6,9,3,8,7);
insertionSort($arr);
echo implode(',',$arr);</langsyntaxhighlight>
<pre>1,2,3,4,6,7,8,9</pre>
 
=={{header|PicoLisp}}==
<langsyntaxhighlight PicoLisplang="picolisp">(de insertionSort (Lst)
(for (I (cdr Lst) I (cdr I))
(for (J Lst (n== J I) (cdr J))
(T (> (car J) (car I))
(rot J (offset I J)) ) ) )
Lst )</langsyntaxhighlight>
{{out}}
<pre>: (insertionSort (5 3 1 7 4 1 1 20))
Line 3,746 ⟶ 4,321:
 
=={{header|PL/I}}==
<langsyntaxhighlight lang="pli">
insert_sort: proc(array);
dcl array(*) fixed bin(31);
Line 3,764 ⟶ 4,339:
end;
end insert_sort;
</syntaxhighlight>
</lang>
 
=={{header|PL/M}}==
<langsyntaxhighlight lang="plm">100H:
 
/* INSERTION SORT ON 16-BIT INTEGERS */
Line 3,812 ⟶ 4,387:
 
CALL BDOS(0,0);
EOF</langsyntaxhighlight>
{{out}}
<pre>0 1 2 2 3 4 8 31 65 99 782</pre>
Line 3,818 ⟶ 4,393:
=={{header|PowerShell}}==
Very similar to the PHP code.
<langsyntaxhighlight lang="powershell">function insertionSort($arr){
for($i=0;$i -lt $arr.length;$i++){
$val = $arr[$i]
Line 3,832 ⟶ 4,407:
$arr = @(4,2,1,6,9,3,8,7)
insertionSort($arr)
$arr -join ","</langsyntaxhighlight>
{{Out}}
<pre>1,2,3,4,6,7,8,9</pre>
 
=={{header|Prolog}}==
<langsyntaxhighlight lang="prolog">insert_sort(L1,L2) :-
insert_sort_intern(L1,[],L2).
Line 3,850 ⟶ 4,425:
!.
insert([H|T],X,[H|T2]) :-
insert(T,X,T2).</langsyntaxhighlight>
% Example use:
Line 3,860 ⟶ 4,435:
Works with SWI-Prolog.<br>
Insertion sort inserts elements of a list in a sorted list. So we can use foldl to sort a list.
<langsyntaxhighlight Prologlang="prolog">% insertion sort
isort(L, LS) :-
foldl(insert, [], L, LS).
Line 3,879 ⟶ 4,454:
insert([H | T], N, [H|L1]) :-
insert(T, N, L1).
</syntaxhighlight>
</lang>
Example use:
<pre> ?- isort([2,23,42,3,10,1,34,5],L).
Line 3,886 ⟶ 4,461:
 
=={{header|PureBasic}}==
<langsyntaxhighlight PureBasiclang="purebasic">Procedure insertionSort(Array a(1))
Protected low, high
Protected firstIndex, lastIndex = ArraySize(a())
Line 3,905 ⟶ 4,480:
Wend
EndIf
EndProcedure</langsyntaxhighlight>
 
=={{header|Python}}==
<langsyntaxhighlight lang="python">def insertion_sort(L):
for i in xrange(1, len(L)):
j = i-1
Line 3,915 ⟶ 4,490:
L[j+1] = L[j]
j -= 1
L[j+1] = key</langsyntaxhighlight>
 
Using pythonic iterators:
 
<langsyntaxhighlight lang="python">def insertion_sort(L):
for i, value in enumerate(L):
for j in range(i - 1, -1, -1):
if L[j] > value:
L[j + 1] = L[j]
L[j] = value</langsyntaxhighlight>
===Insertion sort with binary search===
<langsyntaxhighlight lang="python">def insertion_sort_bin(seq):
for i in range(1, len(seq)):
key = seq[i]
Line 3,940 ⟶ 4,515:
up = middle
# insert key at position ``low``
seq[:] = seq[:low] + [key] + seq[low:i] + seq[i + 1:]</langsyntaxhighlight>
 
This is also built-in to the standard library:
 
<langsyntaxhighlight lang="python">import bisect
def insertion_sort_bin(seq):
for i in range(1, len(seq)):
bisect.insort(seq, seq.pop(i), 0, i)</langsyntaxhighlight>
 
=={{header|Qi}}==
Based on the scheme version.
<langsyntaxhighlight lang="qi">(define insert
X [] -> [X]
X [Y|Ys] -> [X Y|Ys] where (<= X Y)
Line 3,961 ⟶ 4,536:
 
(insertion-sort [6 8 5 9 3 2 1 4 7])
</syntaxhighlight>
</lang>
 
=={{Header|Quackery}}==
<langsyntaxhighlight Quackerylang="quackery">[ [] swap witheach
[ swap 2dup findwith
[ over > ] [ ]
nip stuff ] ] is insertionsort ( [ --> [ )</langsyntaxhighlight>
 
=={{header|R}}==
Direct translation of pseudocode.
<langsyntaxhighlight lang="r">insertionsort <- function(x)
{
for(i in 2:(length(x)))
Line 3,986 ⟶ 4,561:
x
}
insertionsort(c(4, 65, 2, -31, 0, 99, 83, 782, 1)) # -31 0 1 2 4 65 83 99 782</langsyntaxhighlight>
 
R has native vectorized operations which allow the following, more efficient implementation.
 
<syntaxhighlight lang="r">
<lang r>
insertion_sort <- function(x) {
for (j in 2:length(x)) {
Line 4,008 ⟶ 4,583:
}
}
</syntaxhighlight>
</lang>
 
=={{header|Racket}}==
This implementation makes use of the pattern matching facilities in the Racket distribution.
 
<langsyntaxhighlight lang="racket">
#lang racket
 
Line 4,022 ⟶ 4,597:
[(cons y rst) (cond [(< x y) (cons x ys)]
[else (cons y (insert x rst))])]))
(foldl insert '() l))</langsyntaxhighlight>
 
=={{header|Raku}}==
(formerly Perl 6)
<syntaxhighlight lang="raku" perl6line>sub insertion_sort ( @a is copy ) {
for 1 .. @a.end -> $i {
my $value = @a[$i];
Line 4,041 ⟶ 4,616:
say 'input = ' ~ @data;
say 'output = ' ~ @data.&insertion_sort;
</syntaxhighlight>
</lang>
 
{{out}}
Line 4,049 ⟶ 4,624:
 
=={{header|Rascal}}==
<langsyntaxhighlight lang="rascal">import List;
 
public list[int] insertionSort(a){
Line 4,062 ⟶ 4,637:
}
return a;
}</langsyntaxhighlight>
{{out}}
<langsyntaxhighlight lang="rascal">rascal>rascal>insertionSort([4, 65, 2, -31, 0, 99, 83, 782, 1])
list[int]: [-31,0,1,2,4,65,83,99,782]</langsyntaxhighlight>
 
=={{header|REALbasic}}==
<langsyntaxhighlight lang="vb">Sub InsertionSort(theList() as Integer)
for insertionElementIndex as Integer = 1 to UBound(theList)
dim insertionElement as Integer = theList(insertionElementIndex)
Line 4,078 ⟶ 4,653:
theList(j + 1) = insertionElement
next
End Sub</langsyntaxhighlight>
 
=={{header|REBOL}}==
<langsyntaxhighlight lang="rebol">
; This program works with REBOL version R2 and R3, to make it work with Red
; change the word func to function
Line 4,121 ⟶ 4,696:
; just by adding the date! type to the local variable value the same function can sort dates.
probe insertion-sort [12-Jan-2015 11-Jan-2015 11-Jan-2016 12-Jan-2014]
</syntaxhighlight>
</lang>
 
{{out}}
Line 4,138 ⟶ 4,713:
[12-Jan-2014 11-Jan-2015 12-Jan-2015 11-Jan-2016]
</pre>
 
=={{header|Refal}}==
<syntaxhighlight lang="refal">$ENTRY Go {
, 7 6 5 9 8 4 3 1 2 0: e.Arr
= <Prout e.Arr>
<Prout <Sort e.Arr>>;
};
 
Sort {
(e.S) = e.S;
(e.S) s.I e.X = <Sort (<Insert s.I e.S>) e.X>;
e.X = <Sort () e.X>;
};
 
Insert {
s.N = s.N;
s.N s.M e.X, <Compare s.N s.M>: {
'+' = s.M <Insert s.N e.X>;
s.C = s.N s.M e.X;
};
};</syntaxhighlight>
{{out}}
<pre>7 6 5 9 8 4 3 1 2 0
0 1 2 3 4 5 6 7 8 9</pre>
 
=={{header|REXX}}==
<langsyntaxhighlight lang="rexx">/*REXX program sorts a stemmed array (has characters) using the insertion sort algorithm*/
call gen /*generate the array's (data) elements.*/
call show 'before sort' /*display the before array elements. */
Line 4,169 ⟶ 4,768:
return
/*──────────────────────────────────────────────────────────────────────────────────────*/
show: do j=1 for #; say ' element' right(j,length(#)) arg(1)": " @.j; end; return</langsyntaxhighlight>
{{out|output|text=&nbsp; when using the default internal data:}}
<pre>
Line 4,196 ⟶ 4,795:
 
=={{header|Ring}}==
<langsyntaxhighlight lang="ring">
alist = [7,6,5,9,8,4,3,1,2,0]
see insertionsort(alist)
Line 4,211 ⟶ 4,810:
next
return blist
</syntaxhighlight>
</lang>
 
=={{header|RPL}}==
In RPL, the condition <code>while j > 0 and A[j] > value do</code> needs to be fully assessed before performing the loop: an error would then occur when j will equal zero. This is why the loop condition has been encapsulated in a <code>IFERR..THEN..END</code> structure, which removes the need to test the value of j.
{{works with|Halcyon Calc|4.2.7}}
{| class="wikitable"
! RPL code
! Comment
|-
|
≪ 'A' STO
2 A SIZE '''FOR''' ii
A ii GET
ii 1 -
'''WHILE '''
'''IFERR''' DUP2 A SWAP GET < '''THEN''' 3 DROPN 0 '''END REPEAT'''
'A' OVER GETI PUT
1 -
'''END '''
'A' SWAP 1 + ROT PUT
'''NEXT '''
A 'A' PURGE
≫ 'ISORT' STO
|
''( [array] -- [array] ) ''
for i from 2 to length[A] do ''// RPL arrays starts at 1''
value := A[i]
j := i-1
while
j > 0 and A[j] > value do
A[j+1] := A[j]
j := j-1
done
A[j+1] = value
done
Display result and delete global variable
|}
{{in}}
<pre>
[ 1 4 -1 0 3 7 4 8 20 -6 ] ISORT
</pre>
{{out}}
<pre>
1: [ -6 -1 0 1 3 4 4 7 8 20 ]
</pre>
 
=={{header|Ruby}}==
<langsyntaxhighlight lang="ruby">class Array
def insertionsort!
1.upto(length - 1) do |i|
Line 4,230 ⟶ 4,874:
ary = [7,6,5,9,8,4,3,1,2,0]
p ary.insertionsort!
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</langsyntaxhighlight>
 
Alternative version which doesn't swap elements but rather removes and inserts the value at the correct place:
<langsyntaxhighlight lang="ruby">class Array
def insertionsort!
1.upto(length - 1) do |i|
Line 4,247 ⟶ 4,891:
ary = [7,6,5,9,8,4,3,1,2,0]
p ary.insertionsort!
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</langsyntaxhighlight>
 
=={{header|Run BASIC}}==
<langsyntaxhighlight lang="runbasic">dim insSort(100)
sortEnd = 0
global inSort
Line 4,280 ⟶ 4,924:
insSort(i) = x
sortEnd = sortEnd + 1
end function</langsyntaxhighlight>
<pre>End Sort:20
1 124
Line 4,298 ⟶ 4,942:
 
=={{header|Rust}}==
<langsyntaxhighlight lang="rust">fn insertion_sort<T: std::cmp::Ord>(arr: &mut [T]) {
for i in 1..arr.len() {
let mut j = i;
Line 4,306 ⟶ 4,950:
}
}
}</langsyntaxhighlight>
 
=={{header|SASL}}==
Copied from SASL manual, Appendix II, answer (2)(a)
<syntaxhighlight lang="sasl">DEF
<lang SASL>DEF
sort () = ()
sort (a : x) = insert a (sort x)
Line 4,316 ⟶ 4,960:
insert a (b : x) = a < b -> a : b : x
b : insert a x
?</langsyntaxhighlight>
 
=={{header|Scala}}==
<langsyntaxhighlight lang="scala">def insertSort[X](list: List[X])(implicit ord: Ordering[X]) = {
def insert(list: List[X], value: X) = list.span(x => ord.lt(x, value)) match {
case (lower, upper) => lower ::: value :: upper
}
list.foldLeft(List.empty[X])(insert)
}</langsyntaxhighlight>
 
=={{header|Scheme}}==
<langsyntaxhighlight lang="scheme">(define (insert x lst)
(if (null? lst)
(list x)
Line 4,342 ⟶ 4,986:
(insertion-sort (cdr lst)))))
 
(insertion-sort '(6 8 5 9 3 2 1 4 7))</langsyntaxhighlight>
 
=={{header|Seed7}}==
<langsyntaxhighlight lang="seed7">const proc: insertionSort (inout array elemType: arr) is func
local
var integer: i is 0;
Line 4,360 ⟶ 5,004:
arr[j] := help;
end for;
end func;</langsyntaxhighlight>
 
Original source: [http://seed7.sourceforge.net/algorith/sorting.htm#insertionSort]
 
=={{header|Sidef}}==
<langsyntaxhighlight lang="ruby">class Array {
method insertion_sort {
{ |i|
Line 4,381 ⟶ 5,025:
 
var a = 10.of { 100.irand }
say a.insertion_sort</langsyntaxhighlight>
 
=={{header|SNOBOL4}}==
<langsyntaxhighlight lang="snobol">* read data into an array
A = table()
i = 0
Line 4,403 ⟶ 5,047:
* output sorted data
while output = A<i>; i = ?lt(i,aSize) i + 1 :s(while)
end</langsyntaxhighlight>
 
=={{header|Stata}}==
<langsyntaxhighlight lang="stata">mata
void insertion_sort(real vector a) {
real scalar i, j, n, x
Line 4,420 ⟶ 5,064:
}
}
end</langsyntaxhighlight>
 
=={{header|Swift}}==
Using generics.
<langsyntaxhighlight Swiftlang="swift">func insertionSort<T:Comparable>(inout list:[T]) {
for i in 1..<list.count {
var j = i
Line 4,433 ⟶ 5,077:
}
}
}</langsyntaxhighlight>
 
=={{header|Tcl}}==
<langsyntaxhighlight lang="tcl">package require Tcl 8.5
 
proc insertionsort {m} {
Line 4,451 ⟶ 5,095:
}
 
puts [insertionsort {8 6 4 2 1 3 5 7 9}] ;# => 1 2 3 4 5 6 7 8 9</langsyntaxhighlight>
 
=={{header|TI-83 BASIC}}==
Line 4,478 ⟶ 5,122:
 
=={{header|uBasic/4tH}}==
<syntaxhighlight lang="text">PRINT "Insertion sort:"
n = FUNC (_InitArray)
PROC _ShowArray (n)
Line 4,526 ⟶ 5,170:
PRINT
RETURN</langsyntaxhighlight>
 
=={{header|UnixPipes}}==
<langsyntaxhighlight lang="bash">selectionsort() {
read a
test -n "$a" && ( selectionsort | sort -nm <(echo $a) -)
}</langsyntaxhighlight>
<syntaxhighlight lang ="bash">cat to.sort | selectionsort</langsyntaxhighlight>
 
=={{header|Ursala}}==
<langsyntaxhighlight Ursalalang="ursala">#import nat
 
insort = ~&i&& @hNCtX ~&r->lx ^\~&rt nleq-~rlrSPrhlPrSCPTlrShlPNCTPQ@rhPlD</langsyntaxhighlight>
test program:
<langsyntaxhighlight Ursalalang="ursala">#cast %nL
 
example = insort <45,82,69,82,104,58,88,112,89,74></langsyntaxhighlight>
{{out}}
<pre>
Line 4,550 ⟶ 5,194:
=={{header|Vala}}==
{{trans|Nim}}
<langsyntaxhighlight lang="vala">void insertion_sort(int[] array) {
var count = 0;
for (int i = 1; i < array.length; i++) {
Line 4,568 ⟶ 5,212:
foreach (int i in array)
print("%d ", i);
}</langsyntaxhighlight>
{{out}}
<pre>
Line 4,575 ⟶ 5,219:
 
=={{header|VBA}}==
{{trans|Phix}}<langsyntaxhighlight lang="vb">Option Base 1
Private Function insertion_sort(s As Variant) As Variant
Dim temp As Variant
Line 4,596 ⟶ 5,240:
Debug.Print "Before: ", Join(s, ", ")
Debug.Print "After: ", Join(insertion_sort(s), "' ")
End Sub</langsyntaxhighlight>{{out}}
<pre>Before: 4, 15, delta, 2, -31, 0, alpha, 19, gamma, 2, 13, beta, 782, 1
After: -31' 0' 1' 2' 2' 4' 13' 15' 19' 782' alpha' beta' delta' gamma</pre>
Line 4,602 ⟶ 5,246:
=={{header|VBScript}}==
{{trans|REALbasic}}
<langsyntaxhighlight lang="vb">Randomize
Dim n(9) 'nine is the upperbound.
'since VBS arrays are 0-based, it will have 10 elements.
Line 4,638 ⟶ 5,282:
Next
End Sub
</syntaxhighlight>
</lang>
{{Out}}
<pre>ORIGINAL : 26699;2643;10249;31612;21346;19702;29799;31115;20413;5197;
SORTED : 2643;5197;10249;19702;20413;21346;26699;29799;31115;31612;</pre>
 
=={{header|V (Vlang)}}==
<syntaxhighlight lang="v (vlang)">fn insertion(mut arr []int) {
for i in 1 .. arr.len {
value := arr[i]
Line 4,661 ⟶ 5,305:
insertion(mut arr)
println('Output: ' + arr.str())
}</langsyntaxhighlight>
{{out}}
<pre>Input: [4, 65, 2, -31, 0, 99, 2, 83, 782, 1]
Line 4,667 ⟶ 5,311:
 
=={{header|Wren}}==
<langsyntaxhighlight ecmascriptlang="wren">var insertionSort = Fn.new { |a|
for (i in 1..a.count-1) {
var v = a[i]
Line 4,679 ⟶ 5,323:
}
 
var asarray = [ [4, 65, 2, -31, 0, 99, 2, 83, 782, 1], [7, 5, 2, 6, 1, 4, 2, 6, 3] ]
for (a in asarray) {
System.print("Before: %(a)")
insertionSort.call(a)
System.print("After : %(a)")
System.print()
}</langsyntaxhighlight>
 
{{out}}
Line 4,698 ⟶ 5,342:
Alternatively we can just call a library method.
{{libheader|Wren-sort}}
<langsyntaxhighlight ecmascriptlang="wren">import "./sort" for Sort
 
var asarray = [ [4, 65, 2, -31, 0, 99, 2, 83, 782, 1], [7, 5, 2, 6, 1, 4, 2, 6, 3] ]
for (a in asarray) {
System.print("Before: %(a)")
Sort.insertion(a)
System.print("After : %(a)")
System.print()
}</langsyntaxhighlight>
 
{{out}}
Line 4,714 ⟶ 5,358:
 
=={{header|XPL0}}==
<langsyntaxhighlight XPL0lang="xpl0">code ChOut=8, IntOut=11;
 
proc InsertionSort(A, L); \Sort array A of length L
Line 4,734 ⟶ 5,378:
InsertionSort(A, 10);
for I:= 0 to 10-1 do [IntOut(0, A(I)); ChOut(0, ^ )];
]</langsyntaxhighlight>
 
{{out}}
Line 4,744 ⟶ 5,388:
=={{header|Yabasic}}==
{{trans|FreeBASIC}}
<langsyntaxhighlight lang="yabasic">
sub InsertionSort (matriz())
for i = 1 to arraysize(matriz(),1)
Line 4,774 ⟶ 5,418:
print
end
</syntaxhighlight>
</lang>
 
 
=={{header|Yorick}}==
Based on pseudocode, except using 1-based arrays.
<langsyntaxhighlight lang="yorick">func insertionSort(&A) {
for(i = 2; i <= numberof(A); i++) {
value = A(i);
Line 4,789 ⟶ 5,433:
A(j+1) = value;
}
}</langsyntaxhighlight>
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn insertionSort(list){
sink:=List();
foreach x in (list){
Line 4,799 ⟶ 5,443:
}
sink.close();
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">insertionSort(T(4,65,2,-31,0,99,2,83,782,1)).println();
insertionSort("big fjords vex quick waltz nymph".split()).println();</langsyntaxhighlight>
{{out}}
<pre>
56

edits