Insertion Sort Algorithmus in Java mit Programmbeispiel

โšก Intelligente Zusammenfassung

Einfรผgesortierung in Java Erstellt einen sortierten Abschnitt eines Arrays Element fรผr Element, indem er grรถรŸere Werte nach rechts verschiebt, bis jeder Schlรผssel an der richtigen Position steht. Dadurch eignet er sich ideal fรผr kleine Datensรคtze.

  • ๐Ÿ”˜ Definition: Beim Insertion Sort wird ein Element entfernt und an der richtigen Stelle innerhalb des sortierten Bereichs eingefรผgt.
  • โ˜‘๏ธ Verarbeiten: Bei jedem Durchlauf wird der Schlรผssel mit frรผheren Werten verglichen und grรถรŸere Werte werden um eine Position nach rechts verschoben.
  • โœ… Programm (kann in Englisch und Deutsch durchgefuehrt werden) Das Java Beispiel sortiert {860, 8, 200, 9} und gibt jeden Vergleich und Tausch aus.
  • ๐Ÿงช Komplexitรคt: Im besten Fall betrรคgt die Laufzeit O(n), im durchschnittlichen und im schlechtesten Fall O(nยฒ).
  • ๏ธ Erinnerung: Die Sortierung erfolgt direkt am Speicherort, sodass der zusรคtzliche Speicherplatz fรผr jede ArraygrรถรŸe konstant bei O(1) bleibt.
  • ๐Ÿ“Š Verhalten: Der Algorithmus ist stabil und adaptiv, sodass nahezu sortierte Arrays nach sehr wenigen Verschiebungen fertiggestellt werden.

Insertion Sort Algorithmus in Java

Was ist ein Einfรผgungssortierungsalgorithmus?

Einfรผgungssortierung ist ein einfacher Sortieralgorithmus, der fรผr kleine Datensรคtze geeignet ist. Wรคhrend jeder Iteration fรผhrt der Algorithmus Folgendes aus:

  • Entfernt ein Element aus einem Array.
  • Vergleicht es mit dem grรถรŸten Wert im Array.
  • Verschiebt das Element an die richtige Position.

Das Verhalten รคhnelt der Art und Weise, wie ein Kartenspieler seine Karten anordnet: Jede neue Karte wird aufgenommen und nach links an allen grรถรŸeren Karten vorbeigeschoben, bis sie an der richtigen Stelle liegt. Da alle Verschiebungen innerhalb des ursprรผnglichen Arrays stattfinden, ist der Einfรผgesortieralgorithmus sowohl in-place als auch stabil.

Es gehรถrt zur selben Familie von Anfรคngerfreundlichen Java Sortierroutinen als Blase sortierenAllerdings fรผhrt es normalerweise weitaus weniger Schreibvorgรคnge auf Daten durch, die bereits teilweise geordnet sind.

Prozess des Einfรผgungssortieralgorithmus

So funktioniert der Einfรผgesortieralgorithmus grafisch:

Animierte trace des Insertion-Sort-Algorithmus, der eine unsortierte Liste neu anordnet
Prozess des Einfรผgungssortieralgorithmus

Die Animation wiederholt dieselben drei Schritte. Java Das unten stehende Programm wird ausgefรผhrt. Die Trockenlauftabelle tracFรผhre diese Schritte am Beispielarray {860, 8, 200, 9} genau so aus, wie das Programm sie zur Laufzeit ausgibt.

Passieren Schlรผsselelement Vergleiche wurden angestellt Array nach dem Durchlauf
1 8 8 gegen 860 8 860 200 9
2 200 200 gegen 860 8 200 860 9
3 9 9 gegen 860, dann 9 gegen 200 8 9 200 860

Beachten Sie, dass im dritten Durchlauf zwei Vergleiche erforderlich sind, da der Schlรผssel 9 zwei grรถรŸere Werte passieren muss. Die Anzahl der Vergleiche steigt daher mit der Abweichung der Elemente von der ursprรผnglichen Reihenfolge.

Java Programmbeispiel zum Sortieren eines Arrays mithilfe des Insertionsort-Algorithmus:

Das folgende Programm sortiert das Array {860, 8, 200, 9} und gibt einen fortlaufenden Kommentar aus, sodass jeder Vergleich und jede Verschiebung sichtbar ist. Speichern Sie es unter dem Namen InsertionSortExample.java und kompilieren Sie es mit einer beliebigen JDK 8- oder spรคteren 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();
	    
	}
}

Die Ausfรผhrung der Klasse erzeugt Folgendes: trace ist hier abgebildet. Jedes Sortierpassnummer Die erste Zeile markiert eine Iteration der รคuรŸeren Schleife, und die nach jedem Tausch ausgegebene Zeile zeigt das Array in seinem aktuellen Zustand.

Code Ausgang:

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

Zeit- und Speicherkomplexitรคt des Einfรผgesortierverfahrens

Die Leistung des Insertionsort-Algorithmus hรคngt stark davon ab, wie geordnet die Eingabe bereits ist. Deshalb unterscheiden sich der beste und der schlechteste Fall um eine ganze GrรถรŸenordnung.

Case Eingangsbedingung Zeitliche Komplexitรคt
Besten Das Array ist bereits sortiert, daher wird die innere while-Schleife nie ausgefรผhrt. O (n)
Durchschnittlich Die Elemente treffen in zufรคlliger Reihenfolge ein. O(nยฒ)
Wurst Das Array ist in umgekehrter Reihenfolge sortiert, sodass jeder Schlรผssel an den Anfang wandert. O(nยฒ)

Die Raumnutzung ist wesentlich einfacher. Nur die Zรคhler i, j, n und key werden erstellt und das Array wird an Ort und Stelle neu angeordnet, sodass der zusรคtzliche Speicherplatz unabhรคngig von der GrรถรŸe der Eingabe O(1) betrรคgt.

Da die innere Schleife stoppt, sobald sie auf einen kleineren Wert trifft, wird Insertion Sort als adaptiv bezeichnet: Je nรคher die Eingabe an der sortierten Reihenfolge liegt, desto mehr nรคhert sich die Laufzeit einem linearen Wert an.

Vor- und Nachteile des Einfรผgesortierverfahrens

Insertionsort hat sich trotz seines quadratischen Mittelwerts in Produktionsbibliotheken behauptet, weil seine konstanten Faktoren winzig sind und sein Verhalten vorhersehbar ist.

Vorteile

  • Einfach zu schreiben und leicht zu trace von Hand, was es sowohl fรผr den Unterricht als auch fรผr Vorstellungsgesprรคche geeignet macht.
  • Stabil, sodass Datensรคtze, die denselben Schlรผssel verwenden, ihre ursprรผngliche relative Reihenfolge beibehalten.
  • In-Place, benรถtigt nur O(1) zusรคtzlichen Speicher รผber das Eingabe-Array hinaus.
  • Adaptiv, erreicht O(n) bei Daten, die bereits nahezu sortiert sind.
  • Online, was bedeutet, dass es eine Liste sortieren kann, wรคhrend noch neue Elemente eintreffen.

Nachteile

  • Die quadratische Laufzeit bei zufรคlligen oder umgekehrt geordneten Eingaben macht es fรผr groรŸe Arrays ungeeignet.
  • Bei jedem Shift-Vorgang werden Daten in das Array geschrieben, sodass mehr Daten verschoben werden als beim Selection Sort.
  • Mergesort und Quicksort sind deutlich schneller, sobald die Eingabe einige Dutzend Elemente รผberschreitet.

Eine praktische Regel ist, den Insertion Sort zu verwenden, wenn das Array klein ist, wenn die Daten fast geordnet sind oder wenn ein Divide-and-Conquer-Sort eine Partition auf eine Handvoll Elemente reduziert hat.

Einfรผgesortierung vs. Bubble Sort vs Selection Sort

Alle drei Algorithmen sind quadratische Vergleichssortierverfahren, unterscheiden sich jedoch in ihrer Stabilitรคt, in ihrer Reaktion auf geordnete Eingaben und in der Anzahl der Schreibvorgรคnge.

Eigenschaften Sortieren durch Einfรผgen Bubble Sortieren Auswahl Sortieren
bester Fall O (n) O(n) mit einem Flag fรผr vorzeitigen Abbruch O(nยฒ)
Durchschnitt und Worst-Case-Szenario O(nยฒ) O(nยฒ) O(nยฒ)
Zusรคtzlicher Platz O (1) O (1) O (1)
Stabil Ja Ja Nein, in der Standard-Array-Version
Angepasste Ja Ja, wenn die Flag-Optimierung verwendet wird. Nein
Schreibt in das Array Viele Schichten, wenige bei geordneten Daten Viele Tauschgeschรคfte Genau n-1 Tauschvorgรคnge

Selection Sort ist im Vorteil, wenn Schreibvorgรคnge aufwรคndig sind, da es die wenigsten Vertauschungen durchfรผhrt. Insertion Sort ist in diesem Umfang fast รผberall รผberlegen, insbesondere bei teilweise sortierten Daten. Aus diesem Grund werden Bibliotheksortieralgorithmen wie der hinter [Name des Algorithmus] hรคufig verwendet. verbreitet Java รœbungen und die internen JDK-Funktionen greifen bei sehr kleinen Partitionen darauf zurรผck.

Hรคufig gestellte Fragen

Das erste Element allein ist bereits ein sortiertes Teilarray der Lรคnge eins. Da die Schleife bei Index 1 beginnt, hat sie immer einen Vergleichspunkt, sodass der Schlรผssel an Position i in den sortierten Block links davon eingefรผgt wird.

KI-Assistenten kรถnnen einen Testlauf Zeile fรผr Zeile vorlesen, zusรคtzliche Testarrays generieren und das Big-O-Wachstum anhand des Quellcodes abschรคtzen. Nutzen Sie die Erklรคrung als Lernhilfe und รผberprรผfen Sie die Komplexitรคtsangaben anhand eines Lehrbuchs, bevor Sie sie zitieren.

Ja. GitHub-Copilot Fรผhrt einen Standard-Einfรผgesortiervorgang anhand einer Methodensignatur oder eines Kommentars durch. RevPrรผfen Sie die Randbedingungen selbst, da generierte Schleifen manchmal j >= 0 oder j > -1 inkonsistent mit dem umgebenden Code verwenden.

Der binรคre Einfรผgesortierer findet die Einfรผgeposition mittels binรคrer Suche anstelle eines linearen Scans, wodurch die Anzahl der Vergleiche pro Element von O(n) auf O(log n) reduziert wird. Der Verschiebevorgang bleibt unverรคndert, sodass die Gesamtzeitkomplexitรคt bei O(nยฒ) bleibt.

Ja. Eine rekursive Version sortiert die ersten n-1 Elemente und fรผgt dann das letzte Element in dieses sortierte Prรคfix ein. Die Zeitkomplexitรคt entspricht der iterativen, jedoch wird O(n) Speicherplatz benรถtigt, weshalb die Schleifenversion in der Praxis bevorzugt wird.

Teilweise. Der fรผr primitive Datentypen verwendete Dual-Pivot-Quicksort greift bei sehr kleinen Partitionen auf einen Einfรผgesortieralgorithmus zurรผck, und TimSort, das fรผr Objekte verwendet wird, sortiert kurze Sequenzen mit binรคrem Einfรผgesortieralgorithmus, bevor es sie zusammenfรผhrt.

Hรคufige Fehler sind der Beginn der รคuรŸeren Schleife bei 0, das Schreiben von arr[j] = key anstelle von arr[j+1] = key und das Weglassen der Bedingung j > -1, die eine ArrayIndexOutOfBoundsException auslรถst, wenn der Schlรผssel an Position Null liegt.

Ja. Ersetzen Sie den GrรถรŸer-als-Test durch `compareTo` fรผr einen `Comparable`-Typ oder durch einen `Comparator`-Aufruf. Die Verschiebungslogik bleibt unverรคndert, und die Stabilitรคt wird erhalten, was wichtig ist, wenn Objekte denselben Sortierschlรผssel verwenden.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: