Algoritam sortiranja umetanjem s C-om, C++, Java, Python Primjeri

โšก Pametni saลพetak

Sortiranje umetanjem je metoda sortiranja na mjestu temeljena na usporedbi koja konstruira sortirani popis jedan po jedan element. Stabilna je, prilagodljiva, jednostavna za implementaciju i u praksi je prikladna za male ili gotovo sortirane skupove podataka.

  • ๐Ÿ“ฅ Osnovna ideja: Sortiranje umetanjem bira svaki element i pomiฤe ga lijevo dok ne doฤ‘e na ispravnu poziciju unutar veฤ‡ sortirane podliste.
  • ๐Ÿ” umetak Operacija: Ponavljane usporedbe zamjene s lijevim elementima pokreฤ‡u algoritam, poveฤ‡avajuฤ‡i sortirano podruฤje za jedan element po prolazu vanjske petlje.
  • โšก Sloลพenost vremena: Najbolji sluฤaj se izvrลกava za O(n) za veฤ‡ sortirane podatke, dok najgori i prosjeฤni sluฤajevi doseลพu O(n^2) za obrnute ili zbrkane ulaze.
  • โœ… Nekretnine: Algoritam je online, in-place, stabilan i adaptivan, ลกto ga ฤini predvidljivim za strujanje umetaka i djelomiฤno sortiranih nizova.
  • ๐Ÿงช Code pokrivenost: Referentne implementacije su dane u C-u, C++i Python tako da uฤenici mogu usporeฤ‘ivati โ€‹โ€‹strukture petlji i zamjenjivati โ€‹โ€‹mehanike jednu pored druge.
  • ๐Ÿค– Kut umjetne inteligencije: Moderni AI asistenti vizualiziraju prolaze sortiranja umetanjem i preporuฤuju ga kada su ulazni nizovi kratki ili gotovo ureฤ‘eni.

ล to je sortiranje umetanjem?

Sortiranje umetanjem jedan je od algoritama za sortiranje usporedbom koji se koristi za sortiranje elemenata iteracijom jednog elementa istovremeno i postavljanjem elementa na ispravnu poziciju unutar veฤ‡ ureฤ‘enog podruฤja.

Svaki element se sekvencijalno ubacuje u veฤ‡ sortiranu listu. Veliฤina veฤ‡ sortirane liste u poฤetku je jedan. Algoritam sortiranja umetanjem osigurava da se prvih k elemenata sortira nakon k-te iteracije vanjske petlje.

Buduฤ‡i da sortiranje umetanjem gradi rezultat postupno, intuitivno ga je nauฤiti, lako ga je ispraviti i predstavlja snaลพnu osnovu za vrlo male ulaze gdje bi sloลพeniji algoritmi dodali optereฤ‡enje bez mjerljivih dobitaka.

Karakteristike algoritma sortiranja umetanjem

Algoritam za sortiranje umetanjem ima sljedeฤ‡e vaลพne karakteristike koje objaลกnjavaju njegovo ponaลกanje na stvarnim optereฤ‡enjima:

  • To je stabilna tehnika sortiranja, tako da ne mijenja relativni poredak jednakih elemenata.
  • Uฤinkovit je za manje skupove podataka, ali nije uฤinkovit za veฤ‡e popise gdje dominira kvadratni rast.
  • Sortiranje umetanjem je adaptivno, ลกto smanjuje ukupan broj koraka ako je ulaz djelomiฤno sortiran. Poredak se daje kao ulaz kako bi bio uฤinkovit jer sluฤajni pristup omoguฤ‡uje pomake u konstantnom vremenu tijekom unutarnje petlje.
  • To je algoritam na mjestu, tako da ne zahtijeva pomoฤ‡nu pohranu proporcionalnu veliฤini ulaza.

Imajuฤ‡i na umu ove osobine, sljedeฤ‡i odjeljak objaลกnjava osnovnu operaciju umetanja koja pokreฤ‡e svaki prolaz algoritma.

Kako Insert Operarad?

U algoritmu sortiranja umetanjem, operacija umetanja koristi se za sortiranje nesortiranih elemenata. Pomaลพe u umetanju novog elementa u veฤ‡ sortirani popis uz oฤuvanje postojeฤ‡eg redoslijeda sortiranog podruฤja.

Pseudokod operacije umetanja:

Razmotrimo listu A od N elemenata.

// Insert A[N-1] into 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

umetak Operacijski rad

U gornjem primjeru, novi element 6 umetnut je u veฤ‡ sortiranu listu. Sljedeฤ‡i koraci tracunutarnju petlju dok se novi element pomiฤe lijevo prema svojoj ispravnoj poziciji.

Korak 1) U usporedbi s lijevim susjednim elementom od A[5], 9 > 6, mijenjamo poloลพaj 9 i 6. Sada je element 6 premjeลกten u A[4].

Korak 2) Sada usporeฤ‘ujemo A[4] i A[3] i nalazimo da je A[3] > A[4], pa ponovno mijenjamo pozicije 6 i 8.

Korak 3) Sada usporedimo A[3] i A[2]. Kako je A[2] > A[3], mijenjamo pozicije 7 i 6.

Korak 4) Usporeฤ‘ujemo A[1] i A[2]. Kako je A[1] < A[2], lijevi susjedni element viลกe nije veฤ‡i. Zakljuฤujemo da je 6 ispravno umetnut i ovdje zaustavljamo unutarnju petlju.

Kako funkcionira sortiranje umetanjem

Gore opisana operacija umetanja je okosnica sortiranja umetanjem. Postupak umetanja izvrลกava se na svakom elementu, a na kraju dobivamo sortirani popis kako sortirano podruฤje raste za jedan element u svakom vanjskom prolazu.

Sortiranje umetanjem radi

Gornja slika prikazuje rad sortiranja umetanjem u strukturi podataka. U poฤetku se u sortiranoj podlisti nalazi samo jedan element, tj. 4. Nakon umetanja A[1], tj. 3, veliฤina sortirane podliste raste na 2, a algoritam nastavlja ovaj obrazac sve dok se ne smjesti svaki element.

S uspostavljenim konceptualnim tokom, sljedeฤ‡i odjeljci prikazuju konkretne implementacije u C++, C i Python tako da moลพete usporediti strukture petlji u razliฤitim jezicima.

C++ Program za sortiranje umetanjem

The C++ Implementacija u nastavku koristi dvije ugnijeลพฤ‘ene petlje: vanjska petlja odabire sljedeฤ‡i nesortirani element, a unutarnja petlja ga pomiฤe lijevo dok se ne pronaฤ‘e ispravna pozicija.

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

Izlaz:

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

C Code za sortiranje umetanjem

Ista logika se izravno prevodi u C. Standard printf pozivi zamjenjuju izlaz toka, ali obrazac zamjene unutar unutarnje petlje je identiฤan onome C++ verzija.

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

Izlaz:

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 za sortiranje umetanjem

Python podrลพava zamjenu tuple-ovaping u jednom izrazu, tako da je unutarnja petlja kompaktnija od svog C i C++ kolegama uz oฤuvanje istog algoritamskog ponaลกanja.

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

Izlaz:

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

Svojstva sortiranja umetanjem

Evo vaลพnih svojstava sortiranja umetanjem koja vam pomaลพu da odluฤite kada je to pravi alat:

  • Na liniji: Sortiranje umetanjem moลพe sortirati elemente kako ih prima. Ako smo veฤ‡ sortirali popis elemenata i dodali joลก elemenata na popis, tada ne moramo ponovno pokretati cijeli postupak sortiranja. Umjesto toga, iteriramo samo na novododanim elementima.
  • Na mjestu: Prostorna sloลพenost algoritma sortiranja umetanjem je konstantna i ne zahtijeva dodatni prostor. Ovaj algoritam sortira elemente na mjestu.
  • Stabilan: U sortiranju umetanjem ne mijenjamo elemente ako su im vrijednosti jednake. Na primjer, ako su dva elementa, x i y, jednaka i x se pojavljuje prije y u nesortiranom popisu, tada ฤ‡e se u sortiranom popisu x i dalje pojaviti prije y. To ฤini sortiranje umetanjem stabilnim.
  • Prilagodljivo: A algoritam sortiranja je adaptivno ako traje kraฤ‡e kada su ulazni elementi ili podskup elemenata veฤ‡ sortirani. Kao ลกto smo gore raspravljali, najbolje vrijeme izvoฤ‘enja sortiranja umetanjem je O(N), a najgore vrijeme izvoฤ‘enja je O(N^2). Sortiranje umetanjem je jedan od adaptivnih algoritama sortiranja.

Sloลพenost sortiranja umetanjem

Rasprava o sloลพenosti u nastavku pokriva i koriลกtenje memorije i vrijeme izvoฤ‘enja, tako da moลพete pozicionirati sortiranje umetanjem u odnosu na alternative kao ลกto su Bubble Razvrstaj i Brzo sortiranje.

Sloลพenost prostora

Sortiranje umetanjem ne zahtijeva dodatni prostor za sortiranje elemenata. Prostorna sloลพenost je konstantna, tj. O(1), jer se koristi samo nekoliko privremenih varijabli bez obzira na veliฤinu ulaza.

Sloลพenost vremena

Buduฤ‡i da sortiranje umetanjem ponavlja jedan element odjednom, potreban je N-1 prolaz za sortiranje N elemenata. Za svaki prolaz moลพe napraviti nula zamjena ako su elementi veฤ‡ sortirani ili moลพe trebati mnogo zamjena ako su elementi poredani silaznim redoslijedom.

  • Za prolaz 1, minimalni potrebni swapovi su nula, a maksimalni potrebni swapovi su 1.
  • Za prolaz 2, minimalni potrebni swapovi su nula, a maksimalni potrebni swapovi su 2.
  • Za prolaz N, minimalna potrebna zamjena je nula, a maksimalna potrebna zamjena je N.
  • Minimalni swap je nula, tako da je najbolja vremenska sloลพenost O(N) za ponavljanje N prolaza.
  • Ukupni maksimalni broj zamjena je (1+2+3+4+โ€ฆ+N), tj. N(N+1)/2, pa je najgora vremenska sloลพenost O(N^2).

Evo vaลพne vremenske sloลพenosti sortiranja umetanjem:

  • Sloลพenost u najgorem sluฤaju: O(n^2): Sortiranje niza u silaznom redoslijedu kada se zahtijeva da bude uzlazni je najgori moguฤ‡i scenarij.
  • Sloลพenost u najboljem sluฤaju: O(n): Najbolji sluฤaj se dogaฤ‘a kada je niz veฤ‡ sortiran; vanjska petlja se izvrลกava n puta, dok se unutarnja petlja uopฤ‡e ne izvrลกava. Postoji samo n usporedbi, pa je sloลพenost linearna.
  • Prosjeฤna sloลพenost sluฤaja: O(n^2): To se dogaฤ‘a kada se elementi niza pojavljuju u isprekidanom redoslijedu koji nije ni uzlazni ni silazni.

Pitanja i odgovori

Odaberite sortiranje umetanjem za male nizove, gotovo sortirane podatke ili strujanje umetanja gdje novi elementi stiลพu nakon poฤetnog sortiranja. Njegovo nisko konstantno optereฤ‡enje i adaptivno ponaลกanje ฤesto pobjeฤ‘uju sloลพenije algoritme na tim optereฤ‡enjima.

Da. Sortiranje umetanjem je stabilno jer nikada ne zamjenjuje jednake vrijednosti, ฤuvajuฤ‡i njihov izvorni redoslijed. Takoฤ‘er je in-place jer sortira koristeฤ‡i samo ulazni niz plus mali fiksni broj privremenih varijabli, dajuฤ‡i O(1) pomoฤ‡nog prostora.

Najbolji sluฤaj je O(n) kada je ulaz veฤ‡ sortiran jer se unutarnja petlja nikada ne izvrลกava. Najgori i prosjeฤni sluฤajevi su i O(n^2) kada je niz obrnuto sortiran ili premijeลกan, zbog ponovljenog pomicanja elemenata prema poฤetku niza.

AI asistenti generiraju animacije korak po korak i tablice koje oznaฤavaju trenutni element, sortirano podruฤje i pokazivaฤ usporedbe za svaki prolaz. Ova vizualizacija pomaลพe uฤenicima traczamjene, uoฤavanje pogreลกaka odstupanja za jedan i potvrda da sortirani prefiks raste za jedan element u svakoj vanjskoj iteraciji.

Da. Selektori pokretani umjetnom inteligencijom provjeravaju veliฤinu, distribuciju i predsortiranje polja, a zatim usmjeravaju male ili gotovo sortirane ulaze na sortiranje umetanjem, dok se veฤ‡i nasumiฤni ulazi usmjeravaju na brzo sortiranje ili sortiranje spajanjem. Hibridni algoritmi poput Timsorta veฤ‡ primjenjuju ovu ideju unutar svojih unutarnjih particija.

Sortiranje umetanjem gradi sortirano podruฤje umetanjem svakog novog elementa na ispravnu poziciju, dok sortiranje odabirom opetovano pronalazi minimum nesortiranog podruฤja i dodaje ga. Sortiranje umetanjem je adaptivno i stabilno; standardno sortiranje odabirom nije adaptivno i nije prirodno stabilno.

Saลพmite ovu objavu uz: