Lisäyslajittelu: Algoritmi C, C++, Java, Python Esimerkit

Mikä on lisäyslajittelu?

Lisäyslajittelu on yksi vertailulajittelualgoritmeista, joita käytetään elementtien lajitteluun iteroimalla yhtä elementtiä kerrallaan ja sijoittamalla elementti oikeaan paikkaan.

Jokainen elementti lisätään peräkkäin jo lajiteltuun luetteloon. Jo järjestetyn listan koko on aluksi yksi. Lisäyslajittelualgoritmi varmistaa, että ensimmäiset k elementtiä lajitellaan k:nnen iteraation jälkeen.

Lisäyslajittelualgoritmin ominaisuudet

Lisäyslajittelun algoritmilla on seuraavat tärkeät ominaisuudet:

  • Se on vakaa lajittelutekniikka, joten se ei muuta yhtäläisten elementtien suhteellista järjestystä.
  • Se on tehokas pienille tietojoukoille, mutta ei tehokas suuremmille luetteloille.
  • Lisäyslajittelu on mukautuva, mikä vähentää sen vaiheiden kokonaismäärää, jos se on osittain lajiteltu. Ryhmä tarjotaan syötteenä sen tehostamiseksi.

Miten Insert Operatyöhön?

Insertion Sort -algoritmissa lisäystoimintoa käytetään lajittelemattomien elementtien lajitteluun. Se auttaa lisäämään uuden elementin jo lajiteltuun luetteloon.

Lisäämistoiminnon pseudokoodi:

Tarkastellaan N elementin listaa A.

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   

liite Operatyöhön

Yllä olevassa esimerkissä uusi elementti 6 on lisättävä jo lajiteltuun luetteloon.

Vaihe 1) Verrattuna A[5]:n vasempaan viereiseen elementtiin 9 > 6, vaihdamme 9:n ja 6:n paikkaa. Nyt elementti 6 on siirretty kohtaan A[4].

Vaihe 2) Nyt vertaamme A[4] ja A[3], ja huomaamme, että A[3] > A[4], vaihdamme jälleen 6:n ja 8:n paikkaa.

Vaihe 3) Vertaa nyt A[3] ja A[2], koska A[2] > A[3] vaihtavat 7:n ja 6:n paikan.

Vaihe 4) Vertaamme A[1] ja A[2], ja kun A[1] < A[2], eli vasen viereinen elementti ei ole enää suurempi. Nyt päätämme, että 6 on lisätty oikein, ja lopetamme algoritmin tähän.

Kuinka lisäyslajittelu toimii

Yllä käsitelty lisäystoiminto on lisäyslajittelun selkäranka. Lisäystoimenpide suoritetaan jokaiselle elementille, ja lopulta saamme lajitellun luettelon.

Lisäyslajittelu toimii

Yllä oleva esimerkkikuva havainnollistaa lisäyslajittelun toimintaa tietorakenteessa. Aluksi lajitetussa aliluettelossa on vain yksi elementti eli 4. Kun A[1] eli 3 on lisätty, lajitellun aliluettelon koko kasvaa 2:ksi.

C++ Ohjelma lisäyslajitteluun

#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;
}

lähtö:

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

C Koodi lisäyslajittelulle

#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;
}

lähtö:

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

Python Ohjelma lisäyslajitteluun

#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=" ")

lähtö:

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

Lisäyslajittelun ominaisuudet

Tässä ovat lisäyslajittelun tärkeät ominaisuudet:

  • Online: Lisäyslajittelu voi lajitella elementtejä vastaanottaessaan. Eli jos olemme jo lajitelleet elementtiluettelon ja lisänneet luetteloihin lisää elementtejä, meidän ei tarvitse suorittaa koko lajitteluprosessia uudelleen. Sen sijaan meidän on toistettava vain äskettäin lisätyt elementit.
  • Paikallaan: Lisäyslajittelualgoritmin tilamonimutkaisuus on vakio eikä vaadi ylimääräistä tilaa. Tämä algoritmi lajittelee elementit paikoilleen.
  • Vakaa: Lisäyslajittelussa emme vaihda elementtejä, jos niiden arvot ovat samat. Esimerkiksi kaksi elementtiä, x ja y, ovat yhtä suuret, ja x näkyy ennen y:tä lajittelemattomissa luetteloissa, sitten lajitetussa luettelossa x näkyy ennen y:tä. Tämä tekee lisäyslajittelusta vakaan.
  • Mukautuva: A lajittelualgoritmi on mukautuva, jos se vie vähemmän aikaa, jos syöteelementit tai elementtien osajoukko on jo lajiteltu. Kuten yllä käsittelimme, lisäyslajittelun paras käyntiaika on O(N) ja huonoin käyntiaika on O(N^2). Lisäyslajittelu on yksi mukautuvista lajittelualgoritmeista.

Lisäyslajittelun monimutkaisuus

Avaruuden monimutkaisuus

Lisäyslajittelu ei vaadi ylimääräistä tilaa elementtien lajitteluun, tilan monimutkaisuus on vakio, eli O(1).

Ajan monimutkaisuus

Koska lisäyslajittelu iteroi jokaista elementtiä samanaikaisesti, N-elementin lajitteleminen vaatii N-1 läpimenoa. Jokaisella siirrolla se voi tehdä nollan vaihtoja, jos elementit on jo lajiteltu, tai vaihtaa, jos elementit on järjestetty laskevaan järjestykseen.

  • Passissa 1 vaaditut vähimmäisswapit ovat nolla ja vaadittujen vaihtojen enimmäismäärä on 1.
  • Passissa 2 vaaditut vähimmäisswapit ovat nolla ja vaadittujen vaihtojen enimmäismäärä on 2.
  • Passissa N vaadittu vähimmäisvaihto on nolla ja vaadittujen vaihtojen enimmäismäärä on N.
  • Vähimmäisvaihto on nolla, joten paras aikakompleksisuus on O(N) N:n kierroksen iterointiin.
  • Vaihtosopimusten enimmäismäärä on (1+2+3+4+..+N) i. N(N+1)/2, huonoin aikakompleksisuus on O(N^2).

Tässä on lisäyslajittelun tärkeä aika monimutkaisuus:

  • Pahimman tapauksen monimutkaisuus: O(n2): Matriisin lajittelu laskevaan järjestykseen, kun se on nousevassa järjestyksessä, on pahin skenaario.
  • Paras tapauksen monimutkaisuus: O(n): Parhaan tapauksen monimutkaisuus ilmenee, kun taulukko on jo lajiteltu, ulompi silmukka suoritetaan n kertaa, kun taas sisempi silmukka ei toimi ollenkaan. Vertailuja on vain n. Joten tässä tapauksessa monimutkaisuus on lineaarinen.
  • Keskimääräinen tapauksen monimutkaisuus: O(n2): Se tapahtuu, kun taulukon elementit esiintyvät sekaisin järjestyksessä, joka ei ole nouseva eikä laskeva.

Yhteenveto

  • Lisäyslajittelu on lajittelualgoritmimenetelmä, joka perustuu vertailuun.
  • Se on vakaa lajittelutekniikka, joten se ei muuta yhtäläisten elementtien suhteellista järjestystä.
  • Jokaisessa elementissä lisäystoimintoa käytetään elementin lisäämiseen lajiteltuun aliluetteloon.
  • Lisäyslajittelu on paikallaan tapahtuva lajittelualgoritmi.
  • Lisäyslajittelun huonoin ja keskimääräinen aikakompleksisuus on neliöllinen, eli O(N^2).
  • Lisäyslajittelu ei vaadi aputilaa.