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.

  • ๐Ÿ”˜ Definicija: Sortiranje umetanjem uklanja jedan element i ubacuje ga na njegovo ispravno mjesto unutar sortiranog dijela.
  • โ˜‘๏ธ Proces: Svaki prolaz usporeฤ‘uje kljuฤ s ranijim vrijednostima i pomiฤe veฤ‡e vrijednosti za jednu poziciju udesno.
  • โœ… Program: The Java primjer sortira {860, 8, 200, 9} i ispisuje svaku usporedbu i zamjenu.
  • ๐Ÿงช Sloลพenost: Najbolji sluฤaj se izvrลกava u vremenu O(n), dok prosjeฤni i najgori sluฤajevi doseลพu O(nยฒ).
  • ๐Ÿ› ๏ธ Memorija: Sortiranje se dogaฤ‘a na mjestu, tako da pomoฤ‡ni prostor ostaje na O(1) za bilo koju veliฤinu polja.
  • ๐Ÿ“Š Ponaลกanje: Algoritam je stabilan i adaptivan, tako da gotovo sortirani nizovi zavrลกavaju nakon vrlo malo pomaka.

Algoritam sortiranja umetanjem u Java

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

Animirani trace algoritma sortiranja umetanjem koji mijenja redoslijed nesortiranog popisa
Proces algoritma sortiranja umetanjem

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.

Pitanja i odgovori

Prvi element sam po sebi je veฤ‡ sortirani podniz duljine jedan. Poฤevลกi od indeksa 1 znaฤi da petlja uvijek ima neลกto s ฤime se usporeฤ‘uje, pa se kljuฤ na poziciji i ubacuje u ureฤ‘eni blok s njegove lijeve strane.

AI asistenti mogu prepriฤati probni primjer redak po redak, generirati dodatne testne nizove i procijeniti rast Big O iz izvornog koda. Objaลกnjenje tretirajte kao pomoฤ‡ pri uฤenju i potvrdite tvrdnje o sloลพenosti u odnosu na udลพbenik prije nego ลกto ih citirate.

Da. GitHub kopilot dovrลกava standardno sortiranje umetanjem iz potpisa metode ili komentara. RevRubne uvjete moลพete sami pogledati jer generirane petlje ponekad koriste j >= 0 ili j > -1 ลกto je nedosljedno s okolnim kodom.

Binarno sortiranje umetanjem locira toฤku umetanja binarnim pretraลพivanjem umjesto linearnog skeniranja, smanjujuฤ‡i usporedbe po elementu s O(n) na O(log n). Rad pomicanja ostaje nepromijenjen, tako da ukupna vremenska sloลพenost ostaje O(nยฒ).

Da. Rekurzivna verzija sortira prvih n-1 elemenata, a zatim ubacuje posljednji element u taj sortirani prefiks. To odgovara iterativnoj vremenskoj sloลพenosti, ali dodaje O(n) prostora na stogu, pa je verzija s petljom poลพeljnija u praksi.

Djelomiฤno. Brzo sortiranje s dvostrukim pivotom koje se koristi za primitive vraฤ‡a se na sortiranje umetanjem na vrlo malim particijama, a TimSort, koji se koristi za objekte, sortira kratke nizove binarnim sortiranjem umetanjem prije njihovog spajanja.

ฤŒeste greลกke su pokretanje vanjske petlje od 0, pisanje arr[j] = key umjesto arr[j+1] = key i izostavljanje ฤuvara j > -1, ลกto baca ArrayIndexOutOfBoundsException kada kljuฤ pripada poziciji nula.

Da. Zamijenite test veฤ‡eg od s compareTo za tip Comparable ili s pozivom Comparatora. Logika pomicanja ostaje nepromijenjena, a stabilnost je oฤuvana, ลกto je vaลพno kada objekti dijele isti kljuฤ sortiranja.

Saลพmite ovu objavu uz: