Hoppa till innehåll

Insättningssortering

↑
Sortering Interaktiv genomgång

Insättningssortering bygger upp en sorterad del av listan, ett värde i taget. Metoden är enkel och fungerar bra på små eller nästan sorterade listor.

Egenskap Kom ihåg
Vanlig tidskomplexitet O(n²)
Extra minne O(1)
Stabil? Ja, med implementationen nedan
Passar bäst när Listan är liten eller nästan sorterad

Staplarna visar värden och positioner. Välj Nästa för att undersöka ett moment eller Spela för hela förloppet. Testa egna tal, gärna en redan sorterad och en omvänt sorterad lista.

Interaktiv genomgång0 / 0
Förklara stegen själv och visa svaret när du vill.
Vad händer?

Beskriv själv vad algoritmen gör just nu.

Varför gör vi det?

Varför behövs det här steget?

Nästa steg

Försök förutse nästa steg.

Jämförelser 0Skrivningar 0Händelser 0

Lila: jämförs eller flyttas | Grönt: färdig del | Orange: aktuellt arbetsområde

  1. Börja på index 1. Betrakta det första elementet som en redan sorterad del.
  2. Spara värdet. Det kallas nyckeln. Då kan andra element flyttas utan att nyckeln försvinner.
  3. Sök åt vänster. Jämför nyckeln med värdet direkt till vänster.
  4. Flytta större värden. Skjut varje större värde ett steg åt höger så att en ledig plats uppstår.
  5. Sätt in nyckeln. Stanna när du når början eller hittar ett värde som är mindre än eller lika med nyckeln.
  6. Upprepa. Den sorterade delen växer med ett element per varv.

Med [7, 3, 5] börjar vi med [7]. Sätt in 3 före 7: [3, 7, 5]. Jämför sedan 5 med 7, flytta 7 åt höger och sätt in 5 efter 3. Resultatet blir [3, 5, 7].

C# | InsertionSort.cs
static void InsertionSort(int[] values)
{
for (int i = 1; i < values.Length; i++)
{
int key = values[i];
int j = i - 1;
while (j >= 0 && values[j] > key)
{
values[j + 1] = values[j];
j--;
}
values[j + 1] = key;
}
}
Mått Kostnad Förklaring
Bästa fall O(n) En redan sorterad lista behöver få jämförelser.
Genomsnitt O(n²) Många nycklar behöver flyttas genom den sorterade delen.
Sämsta fall O(n²) Omvänd ordning kräver flest flyttningar.
Extra minne O(1) Indata ändras på plats.
Stabilitet Stabil Lika värden flyttas inte förbi varandra.

En nästan sorterad lista kräver vanligtvis färre förflyttningar. För stora osorterade listor blir den kvadratiska tidsåtgången ofta för dyr.

  • Att glömma spara nyckeln innan element flyttas.
  • Att läsa ett negativt index när sökningen når början.
  • Att använda >= i villkoret och därmed flytta lika värden förbi varandra.

Efter varje yttre iteration är de första i + 1 objekten sorterade. Det är algoritmens viktigaste invariant. Resten behöver ännu inte vara sorterad. Nästa värde placeras in genom att större värden skjuts ett steg åt höger. Därför fungerar metoden ofta bra när indata nästan redan är i ordning.

Algoritmen är enkel, arbetar på plats och kan vara stabil. Den är användbar för korta listor eller små delar inom en mer avancerad sorteringsmetod. På stora osorterade listor blir arbetet däremot ofta kvadratiskt.

Villkoret values[j] > key flyttar inte värden som är lika med key. Därför bevaras deras inbördes ordning. Byter du till >= kan ordningen mellan lika värden ändras.