Invoegsorteeralgoritme in Java met programmavoorbeeld

⚡ Slimme samenvatting

Invoegsortering in Java Het bouwt een gesorteerd gedeelte van een array element voor element op, waarbij grotere waarden naar rechts worden verschoven totdat elke sleutel op de juiste positie terechtkomt, waardoor het ideaal is voor kleine datasets.

  • 🔘 Definitie: Bij insertion sort wordt één element verwijderd en op de juiste plaats in het gesorteerde gedeelte ingevoegd.
  • ☑️ Werkwijze: Bij elke doorgang wordt de sleutel vergeleken met eerdere waarden en worden grotere waarden één positie naar rechts verschoven.
  • ✅ Programma: De Java Het voorbeeld sorteert {860, 8, 200, 9} en print elke vergelijking en verwisseling.
  • 🧪 complexiteit: In het beste geval is de looptijd O(n), terwijl in het gemiddelde en slechtste geval de looptijd O(n²) bedraagt.
  • ️ Geheugen: Sorteren gebeurt op dezelfde plek, dus de extra geheugenruimte blijft O(1) voor elke arraygrootte.
  • 📊 Gedrag: Het algoritme is stabiel en adaptief, waardoor bijna gesorteerde arrays na slechts enkele verschuivingen klaar zijn.

Invoegsorteeralgoritme in Java

Wat is een invoegsorteeralgoritme?

Invoegsortering is een eenvoudig sorteeralgoritme dat geschikt is voor kleine datasets. Tijdens elke iteratie zal het algoritme:

  • Verwijdert een element uit een array.
  • Vergelijk het met de grootste waarde in de reeks.
  • Verplaatst het element naar de juiste locatie.

Het gedrag is vergelijkbaar met de manier waarop een kaartspeler zijn hand schikt: elke nieuwe kaart wordt opgepakt en naar links geschoven, voorbij elke grotere kaart, totdat deze op de juiste plek ligt. Omdat alle verschuivingen binnen de oorspronkelijke array plaatsvinden, is insertion sort zowel in-place als stabiel.

Het behoort tot dezelfde familie van beginnersvriendelijke spellen. Java sorteerroutines als bellen sorterenToch voert het normaal gesproken veel minder schrijfbewerkingen uit op gegevens die al gedeeltelijk geordend zijn.

Invoegsorteeralgoritmeproces

Hier ziet u hoe het algoritme voor het sorteren van invoegingen grafisch werkt:

Geanimeerde trace van het invoegsorteeralgoritme voor het herschikken van een ongesorteerde lijst
Invoegsorteeralgoritmeproces

De animatie herhaalt dezelfde drie stappen. Java Onderstaand programma wordt uitgevoerd. De testtabel tracVoer die stappen uit op de voorbeeldreeks {860, 8, 200, 9}, precies zoals het programma ze tijdens de uitvoering afdrukt.

Passeren Sleutelelement Vergelijkingen gemaakt Array na de pass
1 8 8 tegen 860 8 860 200 9
2 200 200 tegen 860 8 200 860 9
3 9 9 tegen 860, daarna 9 tegen 200 8 9 200 860

Merk op dat stap 3 twee vergelijkingen vereist, omdat de sleutel 9 langs twee grotere waarden moet gaan. Het aantal vergelijkingen neemt dus toe naarmate de volgorde van de elementen verder uit de orde is.

Java Programmavoorbeeld om een ​​array te sorteren met behulp van het invoegsorteeralgoritme:

Het onderstaande programma sorteert de array {860, 8, 200, 9} en print een doorlopend commentaar, zodat elke vergelijking en elke verschuiving zichtbaar is. Sla het op als InsertionSortExample.java en compileer het met elke JDK 8 of latere versie.

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

Het uitvoeren van de klasse produceert het volgende: trace hier getoond. Elk Sorteer pasnummer De regel markeert één iteratie van de buitenste lus, en de regel die na elke wisseling wordt afgedrukt, toont de array zoals die er op dat moment uitziet.

Code Output:

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

Tijd- en ruimtecomplexiteit van invoegsorteerbewerking

De prestaties van insertion sort zijn sterk afhankelijk van hoe geordend de invoer al is, waardoor het beste en het slechtste geval een hele orde van grootte van elkaar verschillen.

SITUATIE Invoerconditie Tijdcomplexiteit
Beste De array is al gesorteerd, dus de binnenste while-lus wordt nooit uitgevoerd. O (n)
Gemiddelde De elementen arriveren in willekeurige volgorde. O(n²)
Slechtst De array is in omgekeerde volgorde gesorteerd, dus elke sleutel komt vooraan te staan. O(n²)

Het ruimtegebruik is veel eenvoudiger. Alleen de aanrechtbladen i, j, n en key worden aangemaakt en de array wordt ter plekke herschikt, zodat de hulpruimte O(1) is, ongeacht hoe groot de invoer wordt.

Omdat de binnenste lus stopt zodra deze een kleinere waarde tegenkomt, wordt insertion sort beschreven als adaptief: hoe dichter de invoer bij de gesorteerde volgorde ligt, hoe dichter de looptijd bij lineair komt.

Voordelen en nadelen van invoegsortering

Invoegsorteeralgoritmen worden ondanks het kwadratische gemiddelde nog steeds veel gebruikt in productiebibliotheken, omdat de constante factoren klein zijn en het gedrag voorspelbaar is.

Voordelen

  • Eenvoudig te schrijven en makkelijk te trace met de hand, wat het geschikt maakt voor lesgeven en interviews.
  • Stabiel, dus records die dezelfde sleutel delen, behouden hun oorspronkelijke relatieve volgorde.
  • In-place, waarbij slechts O(1) extra geheugen nodig is naast de invoerarray.
  • Adaptief, met een complexiteit van O(n) op data die al bijna gesorteerd is.
  • Online, wat betekent dat een lijst gesorteerd kan worden terwijl er nog nieuwe elementen binnenkomen.

Nadelen

  • De kwadratische rekentijd bij willekeurige of omgekeerd geordende invoer maakt het ongeschikt voor grote arrays.
  • Elke shift schrijft naar de array, waardoor er meer data wordt verplaatst dan bij selectiesortering.
  • Merge sort en quicksort presteren aanzienlijk beter zodra de invoer enkele tientallen elementen bevat.

Een praktische vuistregel is om insertion sort te gebruiken wanneer de array klein is, wanneer de gegevens bijna in de juiste volgorde staan, of wanneer een divide-and-conquer sort een partitie heeft gereduceerd tot een handvol elementen.

Invoegsorteermethode versus Bubble Sort versus Selection Sort

Alle drie de algoritmen zijn kwadratische vergelijkingssorteeralgoritmen, maar ze verschillen in stabiliteit, in hoe ze reageren op geordende invoer en in het aantal schrijfbewerkingen dat ze uitvoeren.

criteria Invoegsortering Bubble Sorteren Selectie sorteren
Beste geval O (n) O(n) met een vroegtijdige exit-vlag O(n²)
Gemiddelde en slechtste geval O(n²) O(n²) O(n²)
Extra ruimte O (1) O (1) O (1)
Stal Ja Ja Nee, in de standaard array-versie.
Adaptieve Ja Ja, wanneer de vlagoptimalisatie wordt gebruikt. Nee
Schrijft naar de array Veel diensten, weinig op geordende data. Veel ruilingen Precies n-1 swaps

Selectiesortering wint wanneer een schrijfbewerking kostbaar is, omdat het de minste swaps uitvoert. Invoegsortering wint op deze schaal bijna overal, vooral bij gedeeltelijk geordende data, en daarom zijn bibliotheeksorteringen zoals die achter de selectiesortering zo populair. gemeenschappelijk Java oefeningen En de interne werking van de JDK schakelt er automatisch naar over voor zeer kleine partities.

Veelgestelde vragen

Het eerste element is op zichzelf al een gesorteerde sub-array met lengte één. Door bij index 1 te beginnen, heeft de lus altijd iets om mee te vergelijken, waardoor de sleutel op positie i in het gesorteerde blok links ervan wordt ingevoegd.

AI-assistenten kunnen een testrun regel voor regel becommentariëren, extra testarrays genereren en de Big O-groei schatten op basis van broncode. Beschouw de uitleg als een hulpmiddel bij het studeren en controleer de beweringen over complexiteit aan de hand van een leerboek voordat je ze citeert.

Ja. GitHub-copiloot Voltooit een standaard insertion sort op basis van een methodesignatuur of commentaar. RevBekijk de randvoorwaarden zelf, want gegenereerde lussen gebruiken soms j >= 0 of j > -1 op een manier die niet consistent is met de omringende code.

Bij binaire invoegsortering wordt het invoegpunt bepaald met een binaire zoekopdracht in plaats van een lineaire scan, waardoor het aantal vergelijkingen per element wordt teruggebracht van O(n) naar O(log n). De verschuivingswerkzaamheden blijven ongewijzigd, waardoor de totale tijdscomplexiteit O(n²) blijft.

Ja. Een recursieve versie sorteert de eerste n-1 elementen en voegt vervolgens het laatste element in die gesorteerde prefix in. De tijdscomplexiteit is gelijk aan die van de iteratieve versie, maar er komt O(n) stackruimte bij, dus de lusversie heeft in de praktijk de voorkeur.

Gedeeltelijk. De dual-pivot quicksort die voor primitieve gegevenstypen wordt gebruikt, valt terug op een invoegsorteermethode bij zeer kleine partities, en TimSort, dat voor objecten wordt gebruikt, sorteert korte reeksen met binaire invoegsortering voordat ze worden samengevoegd.

De meest voorkomende fouten zijn: de buitenste lus starten bij 0, arr[j] = key schrijven in plaats van arr[j+1] = key, en de voorwaarde j > -1 weglaten, wat een ArrayIndexOutOfBoundsException veroorzaakt wanneer de sleutel zich op positie nul bevindt.

Ja. Vervang de groter-dan-test door compareTo voor een Comparable-type, of door een Comparator-aanroep. De verschuivingslogica blijft ongewijzigd en de stabiliteit blijft behouden, wat belangrijk is wanneer objecten dezelfde sorteersleutel delen.

Vat dit bericht samen met: