Insertionsort

Insertionsort

Lidt om algoritmen:
Insertion sort virker som når man sorterer en stak kort.
Hvis man skal sortere en stak kort alfabetisk, kunne det gøres på følgende måde.
Man tager det første kort som skal være i den sorterede stak. Det næste kort vurderes, hvis det alfabetisk ligger før end det forrige kort ligges det nedenunder.
Det tredie kort tages og vurdres overfor det øverste i stakken, hvis det kommer førend dette, vurderes det igen med kortet nedenunder o.s.v. indtil dets plads i stakken findes.
Med andre ord indsætter insertion sort elementerne i listen et ad gangen, ved at starte ved begyndelse af listen og bevæger sig et skridt ad gangen indtil den rette placering findes.
Algoritmen implementeres på stort set samme måde som beskrevet ovenfor.

Idet elementerne indsættes virker algoritmen bedre på linkede lister end på arrays, da alle elementerne i array'et skal flyttes for at gøre plads til elementet der skal indsættes.

Hastighed:
Hvis listen har længden L, kan der forventes at L/2 sammenligninger og L/2 assignments skal udføres.
Ved det første element der skal sorteres (hvilket er det andet element i listen), skal der foretages 1 sammenligning og enten 0 eller 1 assignment.
Gennemsnittet af sammenligninger og assignments vil så ligge på ca. L/4 sammenligninger og assignments.
Da der er L-1 elementer der skal sorteres vil der være ca. (L-1)L/4 sammenligninger og assignments der skal udføres for at sortere listen.
Ud fra dette kan man se at insertion sort er en O(n2) algoritme for både sammenligninger og assignments.
Det giver en beregningsmodel på følgende form: L2/4.
Det betyder at for hver fordobling af data der skal sorteres, bliver arbejdsbyrdes firdoblet.

Insertion sort er en af de bedste algoritmer at bruge på allerede sorterede lister, da den ikke flytter noget data.

Eksempel:
Sourcekode til eksempel:
SortAlgorithm.java
MyInsertionSort.java

Eksemplet er implementeret på et array.
MyInsertionSort.java indeholder metoden sort( int[] a ) der udfører sorteringen. Den første while() løkke løber frem i arrayet indtil den finder et element, der skal sorteres. Herefter begynder den anden while() løkke som løber baglæns i arrayet. Den bruges til både at foretage de flytninger af elementer, der skal til for at indsætte det fundne element på den rette plads i arrayet.

Der er metoder til sortering af en vektor.
Metoden print() til at udskrive det sorterede array.