Insättningssortering: Algoritm med C, C++, Java, Python Exempel

Vad är insättningssortering?

Insättningssortering är en av jämförelsesorteringsalgoritmerna som används för att sortera element genom att iterera på ett element i taget och placera elementet i dess korrekta position.

Varje element infogas sekventiellt i en redan sorterad lista. Storleken på den redan sorterade listan är initialt en. Algoritmen för insättningssortering säkerställer att de första k elementen sorteras efter den k:te iterationen.

Egenskaper för insättningssorteringsalgoritm

Algoritmen för insättningssortering har följande viktiga egenskaper:

  • Det är en stabil sorteringsteknik, så den ändrar inte den relativa ordningen för lika element.
  • Det är effektivt för mindre datamängder men inte effektivt för större listor.
  • Insättningssortering är adaptiv, vilket minskar det totala antalet steg om det är delvis sorterat. array tillhandahålls som input för att göra det effektivt.

Hur sätts in Operation arbete?

I Insertion Sort-algoritmen används infogningsoperationen för att sortera osorterade element. Det hjälper att infoga ett nytt element i en redan sorterad lista.

Pseudokod för infogningsoperation:

Betrakta en lista A med N element.

A[N-1] is the element to be inserted in the sorted sublist A[0..N-2].
For i = N-1 to 1:
if A[i] < A[i-1], then swap A[i] and A[i-1]
else Stop   

Insert Operationsarbete

I exemplet ovan ska ett nytt element 6 infogas i en redan sorterad lista.

Steg 1) Jämfört med det vänstra intilliggande elementet av A[5], 9 > 6, byter vi positionen för 9 och 6. Nu flyttas element 6 till A[4].

Steg 2) Nu jämför vi A[4] och A[3], och vi finner att A[3] > A[4], vi byter återigen positionen 6 och 8.

Steg 3) Jämför nu A[3] och A[2], eftersom A[2] > A[3] byter position 7 och 6.

Steg 4) Vi jämför A[1] och A[2], och som A[1] < A[2], dvs det vänstra intilliggande elementet är inte längre större. Nu drar vi slutsatsen att 6 är korrekt infogat och vi stoppar algoritmen här.

Hur insättningssorteringen fungerar

Insättningsoperationen som diskuterats ovan är ryggraden i infogningssorten. Infogningsproceduren exekveras på varje element, och i slutändan får vi den sorterade listan.

Insättningssortering fungerar

Exemplet ovan visar hur infogningssorteringen fungerar i datastrukturen. Inledningsvis finns bara ett element i den sorterade underlistan, dvs. 4. Efter att ha infogat A[1], dvs. 3, växer storleken på den sorterade underlistan till 2.

C++ Program för insättningssortering

#include <iostream>
using namespace std;

int main(){
    //unsorted list
    int unsorted[] = {9,8,7,6,5,4,3,3,2,1};
    
    //size of list
    int size_unsorted = sizeof(unsorted) / sizeof(unsorted[0]); 

    //printing unsorted list
    cout << "\nUnsorted: ";
    for(int i = 0 ; i < size_unsorted ; i++){
        cout << unsorted[i] << " ";
    } 

    int current_element,temp;

    for(int i = 1; i < size_unsorted; i++){        
        current_element = unsorted[i];
        for(int j = i-1; j >= 0 && unsorted[j] > current_element; j--){
            //swapping if current element is lesser
            temp = unsorted[j+1];
            unsorted[j+1] = unsorted[j];
            unsorted[j] = temp;
        }
    }

    //printing sorted list
    cout << "\nSorted: ";
    for(int i = 0 ; i < size_unsorted ; i++){
        cout << unsorted[i] << " ";
    } 

    return 0;
}

Produktion:

Unsorted: 9 8 7 6 5 4 3 3 2 1 
Sorted: 1 2 3 3 4 5 6 7 8 9

C-kod för insättningssortering

#include <stdio.h>
int main() {
    //unsorted list
    int unsorted[] = {9,8,7,6,5,4,3,3,2,1};

    //size of list
    int size_unsorted = sizeof(unsorted) / sizeof(unsorted[0]);

    //printing unsorted list
    printf("\nUnsorted: ");
    for(int i = 0 ; i < size_unsorted ; i++){
        printf("%d ", unsorted[i]);
    }

    int current_element, temp;

    for(int i = 1; i < size_unsorted; i++){
        current_element = unsorted[i];
        for(int j = i-1; j >= 0 && unsorted[j] > current_element; j--){
            //swapping if current element is lesser
            temp = unsorted[j+1];
            unsorted[j+1] = unsorted[j];
            unsorted[j] = temp;
        }
    }

    //printing sorted list
    printf("\nSorted: ");
    for(int i = 0 ; i < size_unsorted ; i++){
        printf("%d ", unsorted[i]);
    }

    return 0;
}

Produktion:

Output:
Unsorted: 9 8 7 6 5 4 3 3 2 1 
Sorted: 1 2 3 3 4 5 6 7 8 9

Python Program för insättningssortering

#unsorted list
unsorted = [9,8,7,6,5,4,3,3,2,1]

#size of list
size_unsorted = len(unsorted)

#printing unsorted list
print("\nUnsorted: ", end="")
for i in range(size_unsorted):
    print(unsorted[i], end=" ")

for i in range(1, size_unsorted):
    current_element = unsorted[i]
    j = i - 1
    while j >= 0 and unsorted[j] > current_element:
        #swapping if current element is lesser
        unsorted[j+1], unsorted[j] = unsorted[j], unsorted[j+1]
        j -= 1

#printing sorted list
print("\nSorted: ", end="")
for i in range(size_unsorted):
    print(unsorted[i], end=" ")

Produktion:

Unsorted: 9 8 7 6 5 4 3 3 2 1 
Sorted: 1 2 3 3 4 5 6 7 8 9

Egenskaper för insättningssortering

Här är viktiga egenskaper för infogningssortering:

  • Uppkopplad: Infogningssortering kan sortera element allt eftersom den tar emot. Det vill säga, om vi redan har sorterat en lista med element och lagt till några fler element i listorna, så behöver vi inte köra hela sorteringsproceduren igen. Istället behöver vi bara iterera på nyligen tillagda element.
  • På plats: Utrymmeskomplexiteten för insättningssorteringsalgoritmen är konstant och kräver inte extra utrymme. Denna algoritm sorterar element på plats.
  • Stabil: Vid insättningssortering byter vi inte elementen om deras värden är lika. Till exempel, två element, x och y, är lika, och x visas före y i osorterade listor, sedan i den sorterade listan kommer x att visas före y. Detta gör insättningssorteringen stabil.
  • Anpassningsbar: A sorteringsalgoritm är adaptiv om det tar kortare tid om ingångselementen eller delmängden av element redan är sorterade. Som vi diskuterade ovan är den bästa körtiden för insättningssorteringen O(N), och den sämsta körtiden är O(N^2). Insättningssortering är en av de adaptiva sorteringsalgoritmerna.

Insättningssorteringens komplexitet

Rymdkomplexitet

Insättningssorteringen kräver inte extra utrymme för att sortera elementen, utrymmets komplexitet är konstant, dvs O(1).

Tidskomplexitet

Eftersom insättningssortering itererar varje element samtidigt, kräver det N-1 pass för att sortera N element. För varje pass kan den göra nollbyten om elementen redan är sorterade, eller byta om elementen är ordnade i fallande ordning.

  • För pass 1 är de minsta erforderliga bytena noll och de maximala bytena som krävs är 1.
  • För pass 2 är de minsta erforderliga bytena noll och de maximala bytena som krävs är 2.
  • För pass N är det minsta swap som krävs noll, och det maximala swap som krävs är N.
  • Minsta swap är noll, så den bästa tidskomplexiteten är O(N) för att iterera N pass.
  • Totala maximala swappar är (1+2+3+4+..+N) i. N(N+1)/2, den värsta tidskomplexiteten är O(N^2).

Här är den viktiga tidskomplexiteten för infogningssortering:

  • Worst Case Complexity: O(n2): Att sortera en array i fallande ordning när den är i stigande ordning är det värsta scenariot.
  • Best Case-komplexitet: O(n): Best Case-komplexitet uppstår när arrayen redan är sorterad, den yttre slingan körs n antal gånger medan den inre slingan inte körs alls. Det finns bara ett antal jämförelser. Så i det här fallet är komplexiteten linjär.
  • Genomsnittlig ärendekomplexitet: O(n2): Det händer när elementen i en array förekommer i den blandade ordningen, som varken är stigande eller fallande.

Sammanfattning

  • Insättningssortering är en sorteringsalgoritmmetod som är baserad på jämförelsen.
  • Det är en stabil sorteringsteknik, så den ändrar inte den relativa ordningen för lika element.
  • På varje element används infogningsoperationen för att infoga elementet i den sorterade underlistan.
  • Insättningssortering är en sorteringsalgoritm på plats.
  • Den sämsta och genomsnittliga tidskomplexiteten för insättningssorteringen är kvadratisk, dvs O(N^2).
  • Insättningssortering kräver inget extra utrymme.