Algoritam sortiranja umetanjem u Java s primjerom programa
โก Pametni saลพetak
Sortiranje umetanjem Java gradi sortirani dio polja jedan po jedan element, pomiฤuฤi veฤe vrijednosti udesno dok svaki kljuฤ ne doฤe na ispravnu poziciju, ลกto ga ฤini idealnim za male skupove podataka.
ล to je algoritam sortiranja umetanjem?
Sortiranje umetanjem jednostavan je algoritam za sortiranje prikladan za male skupove podataka. Tijekom svake iteracije, algoritam:
- Uklanja element iz niza.
- Usporeฤuje ga s najveฤom vrijednoลกฤu u poredak.
- Premjeลกta element na njegovo ispravno mjesto.
Ponaลกanje odraลพava naฤin na koji igraฤ karata slaลพe ruku: svaka nova karta se uzima i gura lijevo pored svake veฤe karte dok ne stane na pravo mjesto. Buduฤi da se svo pomicanje dogaฤa unutar izvornog niza, sortiranje umetanjem je i na mjestu i stabilno.
Pripada istoj obitelji onih prilagoฤenih poฤetnicima. Java sortiranje rutina kao sortiranje mjehuriฤima, no obiฤno obavlja puno manje zapisa na podatke koji su veฤ djelomiฤno ureฤeni.
Proces algoritma sortiranja umetanjem
Evo kako proces algoritma sortiranja umetanjem radi grafiฤki:

Animacija ponavlja ista tri koraka Java program u nastavku izvodi. Tablica probnog rada tracispisuje te korake na primjeru niza {860, 8, 200, 9}, toฤno onako kako ih program ispisuje za vrijeme izvoฤenja.
| Proฤi | Kljuฤni element | Napravljene usporedbe | Niz nakon prolaza |
|---|---|---|---|
| 1 | 8 | 8 protiv 860 | 8 860 200 9 |
| 2 | 200 | 200 protiv 860 | 8 200 860 9 |
| 3 | 9 | 9 protiv 860, zatim 9 protiv 200 | 8 9 200 860 |
Primijetite da prolaz 3 zahtijeva dvije usporedbe jer kljuฤ 9 mora proฤi pored dvije veฤe vrijednosti. Broj usporedbi stoga raste s time koliko je svaki element izvan redoslijeda na poฤetku.
Java Primjer programa za sortiranje niza pomoฤu algoritma sortiranja umetanjem:
Program u nastavku sortira niz {860, 8, 200, 9} i ispisuje tekuฤi komentar, tako da je svaka usporedba i svaki pomak vidljiv. Spremi ga kao InsertionSortExample.java i kompajlirati ga s bilo kojim JDK 8 ili novijim izdanjem.
package com.guru99; public class InsertionSortExample { public static void main(String a[]) { int[] myArray = {860,8,200,9}; System.out.println("Before Insertion Sort"); printArray(myArray); insertionSort(myArray);//sorting array using insertion sort System.out.println("After Insertion Sort"); printArray(myArray); } public static void insertionSort(int arr[]) { int n = arr.length; for (int i = 1; i < n; i++) { System.out.println("Sort Pass Number "+(i)); int key = arr[i]; int j = i-1; while ( (j > -1) && ( arr [j] > key ) ) { System.out.println("Comparing "+ key + " and " + arr [j]); arr [j+1] = arr [j]; j--; } arr[j+1] = key; System.out.println("Swapping Elements: New Array After Swap"); printArray(arr); } } static void printArray(int[] array){ for(int i=0; i < array.length; i++) { System.out.print(array[i] + " "); } System.out.println(); } }
Pokretanje nastave proizvodi trace prikazano ovdje. Svaki Broj propusnice za sortiranje Linija oznaฤava jednu iteraciju vanjske petlje, a linija ispisana nakon svake zamjene prikazuje niz kakav stoji u tom trenutku.
Code Izlaz:
Before Insertion Sort 860 8 200 9 Sort Pass Number 1 Comparing 8 and 860 Swapping Elements: New Array After Swap 8 860 200 9 Sort Pass Number 2 Comparing 200 and 860 Swapping Elements: New Array After Swap 8 200 860 9 Sort Pass Number 3 Comparing 9 and 860 Comparing 9 and 200 Swapping Elements: New Array After Swap 8 9 200 860 After Insertion Sort 8 9 200 860
Vremenska i prostorna sloลพenost sortiranja umetanjem
Uฤinkovitost sortiranja umetanjem uvelike ovisi o tome koliko je ulaz veฤ ureฤen, zbog ฤega se najbolji i najgori sluฤaj razlikuju za cijeli red rasta.
| Spis | Ulazni uvjet | Vremenska sloลพenost |
|---|---|---|
| Najbolje | Niz je veฤ sortiran, tako da se unutarnja while petlja nikada ne izvrลกava | O (n) |
| prosjek | Elementi dolaze nasumiฤnim redoslijedom | O(nยฒ) |
| najgore | Niz je sortiran obrnuto, tako da svaki kljuฤ putuje na poฤetak | O(nยฒ) |
Koriลกtenje prostora je daleko jednostavnije. Samo pultovi i, j, n i key se stvaraju, a niz se preureฤuje na mjestu, tako da je pomoฤni prostor O(1) bez obzira koliko ulaz raste.
Buduฤi da se unutarnja petlja zaustavlja ฤim naiฤe na manju vrijednost, sortiranje umetanjem opisuje se kao adaptivno: ลกto je ulaz bliลพi sortiranom redoslijedu, to se vrijeme izvoฤenja viลกe pomiฤe prema linearnom.
Prednosti i nedostaci sortiranja umetanjem
Sortiranje umetanjem opstaje u produkcijskim bibliotekama unatoฤ sluฤaju kvadratnog prosjeka, jer su mu konstantni faktori mali, a ponaลกanje predvidljivo.
Prednosti
- Jednostavno za pisanje i lako za tracruฤno, ลกto je prikladno za nastavu i intervjue.
- Stabilan, tako da zapisi koji dijele kljuฤ zadrลพavaju svoj izvorni relativni redoslijed.
- Na mjestu, potrebno je samo O(1) dodatne memorije izvan ulaznog polja.
- Adaptivno, dostiลพuฤi O(n) na podacima koji su veฤ gotovo sortirani.
- Online, ลกto znaฤi da moลพe sortirati popis dok novi elementi joลก uvijek pristiลพu.
Nedostaci
- Kvadratno vrijeme na sluฤajnom ili obrnuto ureฤenom ulazu ฤini ga neprikladnim za velike nizove.
- Svaki shift zapisuje u niz, pa premjeลกta viลกe podataka nego sortiranje odabirom.
- Sortiranje spajanjem i brzo sortiranje ga znatno nadmaลกuju nakon ลกto ulaz proฤe kroz nekoliko desetaka elemenata.
Praktiฤno pravilo je posegnuti za sortiranjem umetanjem kada je niz malen, kada su podaci gotovo u redu ili kada je sortiranje "podijeli i vladaj" svelo particiju na nekoliko elemenata.
Sortiranje umetanjem u odnosu na Bubble Sortiranje vs. sortiranje odabirom
Sva tri algoritma su kvadratne usporedbe, ali se razlikuju po stabilnosti, naฤinu na koji reagiraju na ureฤeni ulaz i broju zapisa koje izvode.
| Kriteriji | Sortiranje umetanja | Bubble Razvrstaj | Sortiranje odabira |
|---|---|---|---|
| Najbolji sluฤaj | O (n) | O(n) sa zastavom ranog izlaska | O(nยฒ) |
| Prosjeฤan i najgori sluฤaj | O(nยฒ) | O(nยฒ) | O(nยฒ) |
| Dodatni prostor | O (1) | O (1) | O (1) |
| Stabilan | Da | Da | Ne, u standardnoj verziji s nizom |
| Prilagodljiv | Da | Da, kada se koristi optimizacija zastavice | Ne |
| Zapisuje u niz | Mnogo pomaka, malo na ureฤenim podacima | Mnoge zamjene | Toฤno n-1 zamjena |
Sortiranje odabirom pobjeฤuje kada je pisanje skupo, jer izvodi najmanje zamjena. Sortiranje umetanjem pobjeฤuje gotovo svugdje drugdje na ovoj skali, posebno na djelomiฤno ureฤenim podacima, zbog ฤega se koriste knjiลพniฤna sortiranja poput onog iza. zajedniฤki Java Vjeลพbe a JDK interni dijelovi se prebacuju na njega za vrlo male particije.
