- Pregled
- Splošni algoritem
- Pseudokoda
- Ilustracija
- Primer C++
- Primer Java
- Analiza zahtevnosti algoritma za razvrščanje vnosov
- Zaključek
Poglobljen pogled na vnosno razvrščanje s klasičnimi primeri.
Sortiranje z vstavljanjem je tehnika razvrščanja, ki jo lahko obravnavamo na način, na katerega igramo karte v roki. Tako kot vstavimo katero koli karto v paket ali jo odstranimo, podobno deluje tudi sortiranje z vstavljanjem.
Tehnika algoritma Insertion sort je učinkovitejša od tehnik Bubble sort in Selection sort, vendar je manj učinkovita od drugih tehnik, kot sta Quicksort in Merge sort.
Pregled
Pri tehniki razvrščanja z vstavljanjem začnemo z drugim elementom, ga primerjamo s prvim elementom in ga postavimo na ustrezno mesto. Nato ta postopek izvedemo za naslednje elemente.
Vsak element primerjamo z vsemi prejšnjimi elementi in element postavimo ali vstavimo na ustrezno mesto. Tehnika razvrščanja z vstavljanjem je bolj izvedljiva za polja z manjšim številom elementov. Uporabna je tudi za razvrščanje povezanih seznamov.
Povezani seznami imajo kazalec na naslednji element (v primeru enojno povezanega seznama) in kazalec na prejšnji element (v primeru dvakratno povezanega seznama). Zato je lažje izvesti razvrščanje po vstavljanju za povezani seznam.
V tem učbeniku raziščemo vse o sortiranju vnosa.
Splošni algoritem
Korak 1 : Ponovite korake od 2 do 5 za K = 1 do N-1
Korak 2 : set temp = A[K]
Korak 3 : nastavite J = K - 1
Korak 4 : Ponovite while temp <=A[J]
nastavite A[J + 1] = A[J]
nastavite J = J - 1
[konec notranje zanke]
Korak 5 : nastavite A[J + 1] = temp
[konec zanke]
Korak 6 : izhod
Tako pri tehniki razvrščanja z vstavljanjem začnemo z drugim elementom, saj domnevamo, da je prvi element vedno razvrščen. Nato od drugega do zadnjega elementa primerjamo vsak element z vsemi prejšnjimi elementi in ga postavimo na ustrezno mesto.
Pseudokoda
Psevdokoda za razvrščanje po vstavitvi je podana spodaj.
procedure insertionSort(array,N ) array - polje za razvrščanje N- število elementov begin int freePosition int insert_val for i = 1 to N -1 do: insert_val = array[i] freePosition = i //lokacija prostega mesta za vstavitev elementa whilefreePosition> 0 and array[freePosition -1]>insert_val do: array [freePosition] = array [freePosition -1] freePosition = freePosition -1 end while //vstavitevštevilo na prostem položaju polje [freePosition] = insert_val end for end procedure
Zgoraj je podana psevdokoda za razvrščanje z vstavljanjem, nato pa bomo to tehniko ponazorili v naslednjem primeru.
Ilustracija
Polje, ki ga je treba razvrstiti, je naslednje:
Pri vsakem prehodu primerjamo trenutni element z vsemi prejšnjimi elementi. Tako pri prvem prehodu začnemo z drugim elementom.
Za popolno razvrščanje polja z N elementi torej potrebujemo N prehodov.
Zgornji prikaz lahko povzamemo v obliki preglednice:
Prehod | Nesortiran seznam | primerjava | Razvrščeni seznam |
---|---|---|---|
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} |
Kot je prikazano na zgornji sliki, začnemo z 2. elementom, saj predvidevamo, da je prvi element vedno razvrščen. Zato začnemo s primerjavo drugega elementa s prvim in zamenjamo položaj, če je drugi element manjši od prvega.
Ta postopek primerjave in zamenjave postavi dva elementa na ustrezno mesto. Nato primerjamo tretji element s prejšnjima elementoma (prvim in drugim) in izvedemo enak postopek, da se tretji element postavi na ustrezno mesto.
Tako pri vsakem prehodu postavimo en element na njegovo mesto. Pri prvem prehodu postavimo drugi element na njegovo mesto. Na splošno torej za postavitev N elementov na pravo mesto potrebujemo N-1 prehodov.
Nato bomo prikazali implementacijo tehnike razvrščanja z vstavljanjem v jeziku C++.
Primer C++
#include using namespace std; int main () { int myarray[10] = { 12,4,3,1,15,45,33,21,10,2}; cout<<"\nVhodni seznam je \n"; for(int i=0;i<10;i++) { cout <="" Izhod:
Seznam vnosov je
12 4 3 1 15 45 33 21 10 2
Razvrščeni seznam je
1 2 3 4 10 12 15 21 33 45
Nato si bomo ogledali izvajanje tehnike razvrščanja z vstavljanjem v jeziku Java.
Primer Java
javni razred Main { public static void main(String[] args) { int[] myarray = {12,4,3,1,15,45,33,21,10,2}; System.out.println("Vhodni seznam elementov ..."); 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] + " "); } } }Izhod:
Vhodni seznam elementov ...
12 4 3 1 15 45 33 21 10 2
razvrščen seznam elementov ...
1 2 3 4 10 12 15 21 33 45
V obeh izvedbah lahko vidimo, da začnemo razvrščati od 2. elementa polja (spremenljivka zanke j = 1) in večkrat primerjamo trenutni element z vsemi prejšnjimi elementi ter nato razvrstimo element, da ga postavimo na pravilno mesto, če trenutni element ni urejen z vsemi prejšnjimi elementi.
Sortiranje z vstavljanjem deluje najbolje in ga je mogoče opraviti v manj prehodih, če je polje delno razvrščeno. Toda z večanjem seznama se njegova zmogljivost zmanjšuje. Druga prednost sortiranja z vstavljanjem je, da je to stabilno sortiranje, kar pomeni, da ohranja vrstni red enakih elementov na seznamu.
Analiza zahtevnosti algoritma za razvrščanje vnosov
Iz psevdokode in zgornjega prikaza je razporeditev z vstavljanjem učinkovit algoritem v primerjavi z bubble sort ali selection sort. Namesto zanke for in trenutnih pogojev uporablja zanko while, ki ne izvaja več dodatnih korakov, ko je polje razvrščeno.
Vendar tudi če razvrščeno polje posredujemo tehniki razvrščanja z vstavljanjem, bo ta še vedno izvajala zunanjo zanko for, zato bo za razvrščanje že razvrščenega polja potrebovala n korakov. Zaradi tega je najboljša časovna zahtevnost razvrščanja z vstavljanjem linearna funkcija N, kjer je N število elementov v polju.
Zato so v nadaljevanju navedene različne zapletenosti za tehniko razvrščanja z vstavljanjem:
Časovna zahtevnost v najslabšem primeru O(n 2 ) Časovna zahtevnost v najboljšem primeru O(n) Povprečna časovna zahtevnost O(n 2 ) Kompleksnost prostora O(1) Kljub tem zapletom lahko še vedno sklepamo, da je sortiranje z vstavljanjem najučinkovitejši algoritem v primerjavi z drugimi tehnikami razvrščanja, kot sta Bubble sort in Selection sort.
Zaključek
Sortiranje z vstavljanjem je najučinkovitejša od vseh treh do zdaj obravnavanih tehnik. Tu predpostavljamo, da je prvi element razvrščen, nato pa vsak element večkrat primerjamo z vsemi prejšnjimi elementi in nato trenutni element postavimo na njegovo pravilno mesto v polju.
V tem učbeniku smo pri obravnavi razvrščanja z vstavljanjem opazili, da elemente primerjamo s prirastkom 1 in da so tudi sosednji. Zaradi te lastnosti je za pridobitev razvrščenega seznama potrebnih več prehodov.
V naslednjem učbeniku bomo obravnavali "lupinsko razvrščanje", ki je izboljšava razvrščanja po izboru.
Pri shell sort uvedemo spremenljivko, znano kot "inkrement" ali "vrzel", s katero seznam razdelimo na podsezname, ki vsebujejo nesorodne elemente, ki so med seboj "vrzel". Shell sort zahteva manj prehodov v primerjavi z Insertion sort in je tudi hitrejši.
V prihodnjih učbenikih bomo spoznali dve tehniki razvrščanja, "Quicksort" in "Mergesort", ki za razvrščanje seznamov podatkov uporabljata strategijo "Deli in vladaj".