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.
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:

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.
