Insertion Sort Algoritm in Java med programexempel

โšก Smart sammanfattning

Insรคttningssortering i Java bygger en sorterad del av en array, ett element i taget, och flyttar stรถrre vรคrden รฅt hรถger tills varje nyckel landar pรฅ sin rรคtta position, vilket gรถr den idealisk fรถr smรฅ datamรคngder.

  • ๐Ÿ”˜ Definition: Insรคttningssortering tar bort ett element och infogar det pรฅ rรคtt plats inuti den sorterade delen.
  • โ˜‘๏ธ Process: Varje pass jรคmfรถr nyckeln med tidigare vรคrden och flyttar stรถrre vรคrden ett steg รฅt hรถger.
  • โœ… Program: Ocuco-landskapet Java exempel sorterar {860, 8, 200, 9} och skriver ut varje jรคmfรถrelse och byte.
  • ๐Ÿงช Komplexitet: Det bรคsta fallet lรถper pรฅ O(n) tid, medan genomsnittliga och vรคrsta fall nรฅr O(nยฒ).
  • ๐Ÿ› ๏ธ Minne: Sortering sker pรฅ plats, sรฅ hjรคlputrymmet stannar vid O(1) oavsett arraystorlek.
  • ๐Ÿ“Š Beteende: Algoritmen รคr stabil och adaptiv, sรฅ nรคstan sorterade matriser avslutas efter vรคldigt fรฅ fรถrskjutningar.

Insertion Sort Algoritm in Java

Vad รคr Insertion Sort Algorithm?

Insรคttningssortering รคr en enkel sorteringsalgoritm som lรคmpar sig fรถr smรฅ datamรคngder. Under varje iteration, algoritmen:

  • Tar bort ett element frรฅn en array.
  • Jรคmfรถr det mot det stรถrsta vรคrdet i array.
  • Flyttar elementet till rรคtt plats.

Beteendet speglar hur en kortspelare arrangerar en hand: varje nytt kort plockas upp och skjuts รฅt vรคnster fรถrbi varje stรถrre kort tills det vilar pรฅ rรคtt plats. Eftersom all fรถrskjutning sker inuti den ursprungliga matrisen รคr insรคttningssortering bรฅde pรฅ plats och stabil.

Den tillhรถr samma familj av nybรถrjarvรคnliga Java sorteringsrutiner som bubbelsorter, men den utfรถr normalt betydligt fรคrre skrivningar pรฅ data som redan รคr delvis ordnad.

Insรคttningssorteringsalgoritmprocess

Sรฅ hรคr fungerar sorteringsalgoritmen fรถr infogning grafiskt:

animerade trace av insรคttningssorteringsalgoritmen som omordnar en osorterad lista
Insรคttningssorteringsalgoritmprocess

Animationen upprepar samma tre steg Java Programmet nedan utfรถrs. Torrkรถrningstabellen tracutfรถr dessa steg pรฅ exempelmatrisen {860, 8, 200, 9}, exakt som programmet skriver ut dem vid kรถrning.

Pass Nyckelelement Jรคmfรถrelser gjorda Matris efter passet
1 8 8 mot 860 8 860 200 9
2 200 200 mot 860 8 200 860 9
3 9 9 mot 860, sedan 9 mot 200 8 9 200 860

Observera att pass 3 behรถver tvรฅ jรคmfรถrelser eftersom tangent 9 mรฅste passera tvรฅ stรถrre vรคrden. Antalet jรคmfรถrelser รถkar dรคrfรถr med hur lรฅngt ur ordning varje element bรถrjar.

Java Programexempel fรถr att sortera en matris med Insertion Sort Algorithm:

Programmet nedan sorterar arrayen {860, 8, 200, 9} och skriver ut en lรถpande kommentar, sรฅ varje jรคmfรถrelse och varje fรถrskjutning รคr synlig. Spara den som InsertionSortExample.java och kompilera den med valfri JDK 8 eller senare version.

package com.guru99;
 
public class InsertionSortExample {
 
	
    public static void main(String a[])
    {    
        int[] myArray  = {860,8,200,9};  
        
        System.out.println("Before Insertion Sort");  
        
        printArray(myArray);
            
        insertionSort(myArray);//sorting array using insertion sort    
           
        System.out.println("After Insertion Sort");  
        
        printArray(myArray);   
    }    
 public static void insertionSort(int arr[]) 
	{  
        int n = arr.length;  
        
        for (int i = 1; i < n; i++)
        {   System.out.println("Sort Pass Number "+(i));
            int key = arr[i];  
            int j = i-1;  
            
            while ( (j > -1) && ( arr [j] > key ) ) 
            {  
            System.out.println("Comparing "+ key  + " and " + arr [j]); 
                arr [j+1] = arr [j];  
                j--;  
            }  
            arr[j+1] = key; 
            System.out.println("Swapping Elements: New Array After Swap");
            printArray(arr);
        }  
    }
 static void printArray(int[] array){
	    
	    for(int i=0; i < array.length; i++)
		{  
			System.out.print(array[i] + " ");  
		} 
	    System.out.println();
	    
	}
}

Att hรฅlla klassen producerar tracvisas hรคr. Varje Sorteringspassnummer linjen markerar en iteration av den yttre loopen, och linjen som skrivs ut efter varje byte visar arrayen som den ser ut just dรฅ.

Code Produktion:

Before Insertion Sort
860 8 200 9 
Sort Pass Number 1
Comparing 8 and 860
Swapping Elements: New Array After Swap
8 860 200 9 
Sort Pass Number 2
Comparing 200 and 860
Swapping Elements: New Array After Swap
8 200 860 9 
Sort Pass Number 3
Comparing 9 and 860
Comparing 9 and 200
Swapping Elements: New Array After Swap
8 9 200 860 
After Insertion Sort
8 9 200 860

Tids- och rumskomplexitet fรถr insรคttningssortering

Prestandan fรถr insรคttningssortering beror starkt pรฅ hur ordnad inmatningen redan รคr, vilket รคr anledningen till att det bรคsta fallet och det vรคrsta fallet skiljer sig รฅt med en hel ordningsstorlek.

Case Inmatningsvillkor Tidskomplexitet
Bรคst Arrayen รคr redan sorterad, sรฅ den inre while-loopen kรถrs aldrig O (n)
Genomsnitt Elementen anlรคnder i slumpmรคssig ordning O(nยฒ)
vรคrsta Matrisen sorteras i omvรคnd ordning, sรฅ varje tangent hamnar lรคngst fram O(nยฒ)

Utrymmesutnyttjandet รคr mycket enklare. Endast rรคknarna i, j, n och key skapas och arrayen omorganiseras pรฅ plats, sรฅ hjรคlputrymmet รคr O(1) oavsett hur stor inmatningen vรคxer.

Eftersom den inre loopen stannar sรฅ snart den mรถter ett mindre vรคrde beskrivs insรคttningssortering som adaptiv: ju nรคrmare ingรฅngen รคr sorterad ordning, desto nรคrmare rรถr sig kรถrtiden linjรคr.

Fรถrdelar och nackdelar med insรคttningssortering

Insรคttningssortering รถverlever i produktionsbibliotek trots sitt kvadratiska medelvรคrde, eftersom dess konstanta faktorer รคr smรฅ och dess beteende รคr fรถrutsรคgbart.

Fรถrdelar

  • Enkel att skriva och lรคtt att trace fรถr hand, vilket passar fรถr undervisning och intervjuer.
  • Stabil, sรฅ poster som delar en nyckel behรฅller sin ursprungliga relativa ordning.
  • Pรฅ plats, behรถver endast O(1) extra minne utรถver inmatningsmatrisen.
  • Adaptiv, nรฅr O(n) pรฅ data som redan รคr nรคstan sorterad.
  • Online, vilket betyder att den kan sortera en lista medan nya element fortfarande anlรคnder.

Nackdelar

  • Kvadratisk tid pรฅ slumpmรคssig eller omvรคnd ordning i inmatningen gรถr den olรคmplig fรถr stora matriser.
  • Varje skift skriver till arrayen, sรฅ den flyttar mer data รคn vad urvalssortering gรถr.
  • Merge sortering och quicksort รถvertrรคffar det bekvรคmt nรคr inmatningen passerar nรฅgra dussin element.

En praktisk regel รคr att anvรคnda insรคttningssortering nรคr arrayen รคr liten, nรคr data nรคstan รคr i ordning, eller nรคr en dela-och-hรคrska-sortering har reducerat en partition till en handfull element.

Insรคttningssortering vs. Bubble-sortering kontra urvalssortering

Alla tre algoritmerna รคr kvadratiska jรคmfรถrelsetyper, men de skiljer sig รฅt i stabilitet, i hur de reagerar pรฅ ordnad inmatning och i antalet skrivningar de utfรถr.

Kriterier Insรคttningssortering Bubble Sortera Urvalssortering
Bรคsta fall O (n) O(n) med en flagga fรถr tidig utgรฅng O(nยฒ)
Genomsnitt och vรคrsta tรคnkbara scenario O(nยฒ) O(nยฒ) O(nยฒ)
Extra utrymme O (1) O (1) O (1)
Stabil Ja Ja Nej, i standardversionen av arrayen
Adaptiv Ja Ja, nรคr flaggoptimering anvรคnds Nej
Skriver till arrayen Mรฅnga skift, fรฅ pรฅ bestรคlld data Mรฅnga byten Exakt n-1 byten

Urvalssortering vinner nรคr en skrivning รคr dyr, eftersom den utfรถr minst antal byten. Insรคttningssortering vinner nรคstan รถverallt annars i denna skala, sรคrskilt pรฅ delvis ordnad data, vilket รคr anledningen till att bibliotekssorteringar som den bakom gemensam Java รถvningar och JDK-internationerna vรคxlar till det fรถr mycket smรฅ partitioner.

Vanliga frรฅgor

Bara det fรถrsta elementet รคr redan en sorterad delmatris med lรคngden ett. Att bรถrja vid index 1 innebรคr att loopen alltid har nรฅgot att jรคmfรถra mot, sรฅ nyckeln vid position i infogas i det ordnade blocket till vรคnster om den.

AI-assistenter kan รฅterberรคtta en testkรถrning rad fรถr rad, generera extra testarrayer och uppskatta tillvรคxten av Big O frรฅn kรคllkod. Behandla fรถrklaringen som ett studiehjรคlpmedel och bekrรคfta komplexitetspรฅstรฅendena mot en lรคrobok innan de citeras.

Ja. GitHub Copilot slutfรถr en standardinsรคttningssortering frรฅn en metodsignatur eller kommentar. RevVisa randvillkoren sjรคlv, eftersom genererade loopar ibland anvรคnder j >= 0 eller j > -1 i ofรถrenlighet med den omgivande koden.

Binรคr insรคttningssortering lokaliserar insรคttningspunkten med en binรคr sรถkning istรคllet fรถr en linjรคr skanning, vilket skรคr jรคmfรถrelser per element frรฅn O(n) till O(log n). Skiftningsarbetet รคr ofรถrรคndrat, sรฅ den totala tidskomplexiteten fรถrblir O(nยฒ).

Ja. En rekursiv version sorterar de fรถrsta n-1 elementen och infogar sedan det sista elementet i det sorterade prefixet. Den matchar den iterativa tidskomplexiteten men lรคgger till O(n) stackutrymme, sรฅ loopversionen รคr att fรถredra i praktiken.

Delvis. Den dubbla pivot-snabbsorteringen som anvรคnds fรถr primitivt รฅtergรฅr till en infogningssortering pรฅ mycket smรฅ partitioner, och TimSort, som anvรคnds fรถr objekt, sorterar korta kรถrningar med binรคr infogningssortering innan de sammanfogas.

De vanligaste felen รคr att starta den yttre loopen vid 0, skriva arr[j] = key istรคllet fรถr arr[j+1] = key, och utelรคmna j > -1-skyddet, vilket utlรถser ArrayIndexOutOfBoundsException nรคr nyckeln hรถr hemma pรฅ position noll.

Ja. Ersรคtt stรถrre-รคn-testet med compareTo fรถr en Comparable-typ, eller med ett Comparator-anrop. Skiftlogiken รคr ofรถrรคndrad och stabiliteten bevaras, vilket รคr viktigt nรคr objekt delar samma sorteringsnyckel.

Sammanfatta detta inlรคgg med: