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.

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


