- Overzicht
- Algemeen algoritme
- Pseudocode
- Illustratie
- C++ voorbeeld
- Java Voorbeeld
- Complexiteitsanalyse van het Insertion Sort-algoritme
- Conclusie
Een diepgaande blik op Insertion Sort met klassieke voorbeelden.
Insertion sort is een sorteertechniek die kan worden gezien als een manier waarop we kaarten bij de hand spelen. Zoals we een kaart in een kaartspel stoppen of verwijderen, werkt insertion sort op een soortgelijke manier.
De Insertion sort-algoritmetechniek is efficiënter dan Bubble sort en Selection sort, maar minder efficiënt dan de andere technieken zoals Quicksort en Merge sort.
Overzicht
Bij de insertion sort techniek beginnen we bij het tweede element en vergelijken het met het eerste element en zetten het op de juiste plaats. Daarna voeren we dit proces uit voor de volgende elementen.
We vergelijken elk element met alle voorgaande elementen en plaatsen of voegen het element in op de juiste plaats. De Insertion sort-techniek is beter uitvoerbaar voor arrays met een kleiner aantal elementen. Ze is ook nuttig voor het sorteren van gelinkte lijsten.
Gekoppelde lijsten hebben een pointer naar het volgende element (in het geval van een enkelvoudig gekoppelde lijst) en ook een pointer naar het vorige element (in het geval van een dubbel gekoppelde lijst). Daarom wordt het gemakkelijker om insertion sort te implementeren voor een gekoppelde lijst.
Laten we in deze handleiding alles over Insertion sort onderzoeken.
Algemeen algoritme
Stap 1 : Herhaal de stappen 2 tot en met 5 voor K = 1 tot N-1
Stap 2 : set temp = A[K]
Stap 3 : stel J = K - 1
Stap 4 : Herhaal terwijl temp <=A[J]
stel A[J + 1] = A[J]
stel J = J - 1
[einde van de binnenste lus].
Stap 5 : stel A[J + 1] = temp
[einde van de lus].
Stap 6 : exit
Bij de insertion sort-techniek beginnen we dus bij het tweede element, omdat we ervan uitgaan dat het eerste element altijd gesorteerd is. Vervolgens vergelijken we van het tweede element tot het laatste element elk element met alle voorgaande elementen en zetten we dat element op de juiste plaats.
Pseudocode
De pseudocode voor insertion sort staat hieronder.
procedure insertionSort(array,N ) array - te sorteren array N- aantal elementen begin int freePosition int insert_val for i = 1 to N -1 do: insert_val = array[i] freePosition = i //lokaliseer vrije positie om het element in te voegen whilefreePosition> 0 and array[freePosition -1]>insert_val do: array [freePosition] = array [freePosition -1] freePosition = freePosition -1 end while //insert denummer op vrije positie array [freePosition] = insert_val end for einde procedure
Bovenstaande is de pseudocode voor Insertion sort, vervolgens zullen we deze techniek illustreren in het volgende voorbeeld.
Illustratie
De array die gesorteerd moet worden is als volgt:
Nu vergelijken we voor elke pas het huidige element met alle voorgaande elementen. Dus in de eerste pas beginnen we met het tweede element.
We hebben dus N aantal passen nodig om een matrix met N aantal elementen volledig te sorteren.
Bovenstaande illustratie kan in tabelvorm worden samengevat:
Pas | Ongesorteerde lijst | vergelijking | Gesorteerde lijst |
---|---|---|---|
1 | {12,3,5,10,8,1} | {12,3} | {3,12,5,10,8,1} |
2 | {3,12,5,10,8,1} | {3,12,5} | {3,5,12,10,8,1} |
3 | {3,5,12,10,8,1} | {3,5,12,10} | {3,5,10,12,8,1} |
4 | {3,5,10,12,8,1} | {3,5,10,12,8} | {3,5,8,10,12,1} |
5 | {3,5,8,10,12,1} | {3,5,8,10,12,1} | {1,3,5,8,10,12} |
6 | {} | {} | {1,3,5,8,10,12} |
Zoals in de bovenstaande illustratie, beginnen we met het 2e element, omdat we aannemen dat het eerste element altijd gesorteerd is. We beginnen dus met het vergelijken van het tweede element met het eerste en verwisselen de positie als het tweede element minder is dan het eerste.
Vervolgens vergelijken we het derde element met de vorige (eerste en tweede) elementen en voeren we dezelfde procedure uit om het derde element op de juiste plaats te zetten.
Op deze manier plaatsen we bij elke stap één element op zijn plaats. Bij de eerste stap plaatsen we het tweede element op zijn plaats. Om N elementen op hun juiste plaats te zetten, hebben we dus in het algemeen N-1 stappen nodig.
Vervolgens demonstreren we de implementatie van de Insertion sort techniek in C++.
C++ voorbeeld
#include using namespace std; int main () { int myarray[10] = { 12,4,3,1,15,45,33,21,10,2}; cout<<"Invoerlijst is \n"; for(int i=0;i<10;i++) { cout <="" Uitgang:
De invoerlijst is
12 4 3 1 15 45 33 21 10 2
De gesorteerde lijst is
1 2 3 4 10 12 15 21 33 45
Vervolgens zullen we de Java-implementatie van de Insertion sort-techniek bekijken.
Java Voorbeeld
public class Main { public static void main(String[] args) { int[] myarray = {12,4,3,1,15,45,33,21,10,2}; System.out.println("Input list of elements ..."); for(int i=0;i<10;i++) { System.out.print(myarray[i] + " "); } for(int k=1; k=0 &temp <= myarray[j]) { myarray[j+1] = myarray[j]; j = j-1; } myarray[j+1] = temp; } System.out.println("nsorted list of elements ..."); for(inti=0;i<10;i++) { System.out.print(myarray[i] + " "); } }.Uitgang:
Input lijst van elementen ...
12 4 3 1 15 45 33 21 10 2
gesorteerde lijst van elementen ...
1 2 3 4 10 12 15 21 33 45
In beide implementaties kunnen we zien dat we beginnen met sorteren vanaf het 2e element van de array (lusvariabele j = 1) en herhaaldelijk het huidige element vergelijken met alle voorgaande elementen en dan het element sorteren om het op de juiste plaats te zetten als het huidige element niet in orde is met alle voorgaande elementen.
Insertion sort werkt het beste en kan in minder stappen worden uitgevoerd als de array gedeeltelijk gesorteerd is. Maar als de lijst groter wordt, neemt de prestatie af. Een ander voordeel van Insertion sort is dat het een Stable sort is, wat betekent dat de volgorde van gelijke elementen in de lijst gehandhaafd blijft.
Complexiteitsanalyse van het Insertion Sort-algoritme
Uit de pseudocode en de illustratie hierboven blijkt dat insertion sort het efficiënte algoritme is in vergelijking met bubble sort of selection sort. In plaats van een for-lus en present conditions gebruikt het een while-lus die geen extra stappen meer uitvoert wanneer de array gesorteerd is.
Maar zelfs als we de gesorteerde array doorgeven aan de Insertion sort-techniek, zal deze nog steeds de buitenste for-lus uitvoeren, waardoor n aantal stappen nodig is om een reeds gesorteerde array te sorteren. Dit maakt de beste tijdscomplexiteit van insertion sort een lineaire functie van N, waarbij N het aantal elementen in de array is.
De verschillende complexiteiten voor de Insertion sort techniek worden hieronder weergegeven:
Worst case tijdscomplexiteit O(n 2 ) Best case tijdscomplexiteit O(n) Gemiddelde tijdscomplexiteit O(n 2 ) Complexiteit van de ruimte O(1) Ondanks deze complexiteit kunnen we toch concluderen dat Insertion sort het meest efficiënte algoritme is in vergelijking met andere sorteertechnieken zoals Bubble sort en Selection sort.
Conclusie
Insertion sort is de meest efficiënte van de drie tot nu toe besproken technieken. Hier gaan we ervan uit dat het eerste element gesorteerd is en vervolgens wordt elk element herhaaldelijk vergeleken met alle voorgaande elementen en wordt het huidige element op de juiste plaats in de array geplaatst.
In deze tutorial hebben we bij de bespreking van Insertion sort opgemerkt dat we de elementen vergelijken met een increment van 1 en dat ze ook aaneengesloten zijn. Hierdoor zijn er meer passen nodig om de gesorteerde lijst te krijgen.
In onze volgende tutorial bespreken we "Shell sort", een verbetering ten opzichte van Selection sort.
Bij shell sort introduceren we een variabele die "increment" of "gap" wordt genoemd en waarmee we de lijst verdelen in sublijsten die niet-aaneengesloten elementen bevatten die "gap" van elkaar verwijderd zijn. Shell sort vereist minder passages in vergelijking met Insertion sort en is ook sneller.
In onze toekomstige tutorials zullen we twee sorteertechnieken leren, "Quicksort" en "Mergesort", die een "verdeel-en-heers"-strategie gebruiken voor het sorteren van gegevenslijsten.