Odabir Razvrstavanje u Java Program s primjerom

โšก Pametni saลพetak

Sortiranje odabira Java opetovano skenira nesortirani dio niza, pronalazi najmanju preostalu vrijednost i zamjenjuje je na poziciju, dovrลกavajuฤ‡i posao s najviลกe n-1 izmjena bez obzira na redoslijed unosa.

  • ๐Ÿ”˜ Definicija: Sortiranje odabirom dijeli niz na sortiranu i nesortiranu regiju u svakom prolazu.
  • โ˜‘๏ธ Proces: Svaki prolaz pretraลพuje nesortirano podruฤje za najniลพi element i zamjenjuje ga naprijed.
  • โœ… Program: The Java primjer sortira {860, 8, 200, 9} i ispisuje svaku usporedbu i zamjenu.
  • ๐Ÿงช Sloลพenost: Najbolji, prosjeฤni i najgori sluฤajevi se izvrลกavaju u vremenu O(nยฒ) jer se broj usporedbi nikada ne smanjuje.
  • ๐Ÿ› ๏ธ Memorija: Zamjene se dogaฤ‘aju unutar originalnog niza, tako da pomoฤ‡ni prostor ostaje na O(1).
  • ๐Ÿ“Š Ponaลกanje: Klasiฤna verzija je nestabilna, ali izvodi najmanje zapisa od bilo koje kvadratne vrste.

Odabir Razvrstavanje u Java Program s primjerom

Kako funkcionira sortiranje odabirom?

Selection Sort implementira jednostavan algoritam sortiranja na sljedeฤ‡i naฤin:

  • Algoritam viลกe puta traลพi najniลพi element.
  • Zamijenite trenutni element s elementom koji ima najmanju vrijednost
  • Sa svakim ponavljanjem/prolaskom sortiranja selekcije, elementi se mijenjaju.

Svaki prolaz stoga tretira poredak kao dvije regije: sortirani blok koji raste s lijeva i nesortirani blok koji se smanjuje s desne strane. Algoritam obilazi nesortirani blok, pamti indeks najmanje vrijednosti koju susreฤ‡e i zamjenjuje tu vrijednost s prvom nesortiranom pozicijom.

Buduฤ‡i da se u jednom prolazu dogaฤ‘a samo jedna zamjena, niz od n elemenata se ureฤ‘uje nakon najviลกe n-1 zamjena. To svojstvo razlikuje ovu rutinu od ostalih rutina poฤetne razine. Java algoritmi sortiranja, koji premjeลกtaju podatke daleko ฤeลกฤ‡e.

The tracSlijedeฤ‡i niz slijedi primjer {860, 8, 200, 9} toฤno onako kako ga program u sljedeฤ‡em odjeljku ispisuje za vrijeme izvoฤ‘enja.

Proฤ‡i Usporedbe tiskane Najmanja pronaฤ‘ena vrijednost Niz nakon zamjene
Start - - 860 8 200 9
1 860 i 8, 8 i 200, 8 i 9 8 8 860 200 9
2 860 i 200, 200 i 9 9 8 9 200 860
3 200 i 860 200 8 9 200 860

Dva detalja u tome tracVrijedi se na njima malo zastati. Prvo, prolaz 3 i dalje prijavljuje zamjenu iako se redoslijed ne mijenja, jer najmanja preostala vrijednost veฤ‡ leลพi na trenutnom indeksu i program zamjenjuje element sam sa sobom. Drugo, broj usporedbi pada za jednu u svakom prolazu (tri, zatim dvije, pa jedna), ลกto je obrazac iza brojki sloลพenosti dalje na stranici.

Java Program za implementaciju Selection Sort

Klasa u nastavku zove se SelectionSortAlgo i nalazi se u paketu com.guru99. Metoda main() deklarira uzorak polja, ispisuje ga, predaje ga selection() za sortiranje i ponovno ga ispisuje. Pomoฤ‡na metoda printArray() zapisuje sve elemente u jedan redak, ลกto stvara ฤitljiv zapisnik prolaza-za-prolaza.

Unutar selection(), vanjska petlja oznaฤava granicu izmeฤ‘u sortiranih i nesortiranih podruฤja, varijabla index drลพi poziciju najmanje vrijednosti viฤ‘ene do sada, a tri dodjele na kraju svakog prolaza izvode zamjenu.

package com.guru99;
 
public class SelectionSortAlgo {
 
	public static void main(String a[])
	{  
		int[] myArray = {860,8,200,9}; 
		
		System.out.println("------Before Selection Sort-----");
 
		printArray(myArray);
 
 
		selection(myArray);//sorting array using selection sort  
 
		System.out.println("-----After Selection Sort-----");  
 
		printArray(myArray); 
	} 
	
		public static void selection(int[] array)
	{  
		for (int i = 0; i < array.length - 1; i++)  
		{  System.out.println("Sort Pass Number "+(i+1));
			int index = i;  
			for (int j = i + 1; j < array.length; j++)
			{   
			    System.out.println("Comparing "+ array[index]  + " and " + array[j]);  
				if (array[j] < array[index]){ 
				System.out.println(array[index]  + " is greater than " + array[j] );
					index = j;
				
				
				}  
			}  
 
			int smallerNumber = array[index];   
			array[index] = array[i];  
			array[i] = smallerNumber;  
			System.out.println("Swapping Elements: New Array After Swap");
			printArray(array);
		}  
	}  
	static void printArray(int[] array){
	    
	    for(int i=0; i < array.length; i++)
		{  
			System.out.print(array[i] + " ");  
		} 
	    System.out.println();
	    
	}
 
}

Izlaz:

Kompajliranje i pokretanje klase proizvodi donji zapisnik konzole, s jednim blokom izlaza po prolazu.

------Before Selection Sort-----
860 8 200 9 
Sort Pass Number 1
Comparing 860 and 8
860 is greater than 8
Comparing 8 and 200
Comparing 8 and 9
Swapping Elements: New Array After Swap
8 860 200 9 
Sort Pass Number 2
Comparing 860 and 200
860 is greater than 200
Comparing 200 and 9
200 is greater than 9
Swapping Elements: New Array After Swap
8 9 200 860 
Sort Pass Number 3
Comparing 200 and 860
Swapping Elements: New Array After Swap
8 9 200 860 
-----After Selection Sort-----
8 9 200 860

Dva problema susreฤ‡u poฤetnike kada prvi put pokrenu ovaj primjer. Buduฤ‡i da datoteka deklarira package com.guru99;, izvor mora ลพivjeti u odgovarajuฤ‡em com/guru99 direktorij, inaฤe kompajler prijavljuje neusklaฤ‘enost naziva paketa ili klase. Klasa se tada mora pokrenuti svojim punim imenom, java com.guru99.SelectionSortAlgo, jer obiฤan java SelectionSortAlgo podiลพe NoClassDefFoundError.

Granice petlje su druga uobiฤajena zamka. Vanjska petlja se zaustavlja na array.length - 1 a unutarnja petlja poฤinje od i + 1; promjena bilo koje granice proizvodi dodatni prazan prolaz ili iznimku ArrayIndexOutOfBoundsException.

Vremenska i prostorna sloลพenost sortiranja odabirom

Unutarnja petlja u programu uvijek se izvrลกava do kraja polja, pa algoritam izvodi isti broj usporedbi bez obzira na to kako podaci izgledaju. Za polje od n elemenata taj zbroj je n(n-1)/2, ลกto je za uzorak od ฤetiri elementa jednako ลกest, a gornji izlaz doista ispisuje toฤno ลกest redaka za usporedbu.

Spis Usporedbe swaps Vremenska sloลพenost Pomoฤ‡ni prostor
Najbolje (niz je veฤ‡ sortiran) n(n-1)/2 n-1 O(nยฒ) O (1)
Prosjek (sluฤajni redoslijed) n(n-1)/2 n-1 O(nยฒ) O (1)
Najgore (obrnuto sortirano) n(n-1)/2 n-1 O(nยฒ) O (1)

Iz tog ujednaฤenog niza slika slijede tri posljedice:

  • Sortiranje odabirom nije adaptivno. Sortirani ulaz koลกta toฤno onoliko koliko i obrnuti ulaz, tako da ne postoji preฤac s ranim izlazom te vrste. sortiranje mjehuriฤ‡ima nudi.
  • Broj zamjena je jaฤa strana algoritma. Odvija se najviลกe n-1 zamjena, ลกto je daleko manje od kvadratnog broja poteza koje druge jednostavne sorte mogu napraviti.
  • Koriลกtenje memorije je konstantno. Potrebni su samo brojaฤi petlji i dvije privremene varijable index i smallerNumber, tako da je pomoฤ‡ni prostor O(1) i sortiranje se dogaฤ‘a na mjestu.

Kvadratni rast je praktiฤno ograniฤenje. Udvostruฤenje veliฤine polja otprilike uฤetverostruฤuje posao usporedbe, tako da sortiranje odabirom odgovara poduฤavanju, malim nizovima i ugraฤ‘enom kodu, a ne produkcijskim skupovima podataka, gdje su algoritmi O(n log n) ispravan izbor.

Prednosti i nedostaci sortiranja odabirom

Razumijevanje gdje algoritam pomaลพe, a gdje odmaลพe olakลกava odluฤivanje kada je razumno posegnuti za njim.

Prednosti

  • Logika je kratka i ฤitljiva, zbog ฤega je to standardna prva vjeลพba sortiranja uz umetanje sortirati.
  • Sortira na mjestu, tako da se ne dodjeljuje drugi niz i koriลกtenje memorije ne raste s ulazom.
  • Izvrลกava najviลกe n-1 zapisa u niz, ลกto je vaลพno za pohranu gdje su zapisi spori ili troลกe medij.
  • Vrijeme izvoฤ‘enja je potpuno predvidljivo, jer broj usporedbi ovisi samo o duljini niza.

Nedostaci

  • Svaki sluฤaj je O(nยฒ), tako da se algoritam ne skalira na velike kolekcije.
  • Ne moลพe otkriti veฤ‡ sortirani niz i stoga nikada ne zavrลกava ranije.
  • Klasiฤni oblik prikazan gore je nestabilan, pa dvije jednake vrijednosti mogu zavrลกiti u suprotnom redoslijedu.
  • ฤŒeลกฤ‡e usporeฤ‘uje od sortiranja umetanjem na gotovo ureฤ‘enim podacima, gdje se sortiranje umetanjem pribliลพava linearnom vremenu.

Ukratko, odaberite sortiranje odabirom kada je niz malen i svako pisanje je skupo, a izbjegavajte ga kad god je skup podataka velik ili veฤ‡ blizu sortiranja.

Sortiranje odabirom u odnosu na Bubble Sortiranje u odnosu na sortiranje umetanjem

Sva tri algoritma su kvadratna, s usporedbom na mjestu, no ponaลกaju se drugaฤije kada se promijeni oblik ulaza.

Kriterij Selekciona sudbina Bubble sortiranje Sortiranje umetanjem
Vrijeme u najboljem sluฤaju O(nยฒ) O (n) O (n)
Prosjeฤno i najgore moguฤ‡e vrijeme O(nยฒ) O(nยฒ) O(nยฒ)
Zamjene ili premjeลกtaji u najgorem sluฤaju n-1 zamjena n(n-1)/2 zamjena Do n(n-1)/2 smjena
Stabilan Ne Da Da
Prilagodljivo sortiranom ulazu Ne Da Da
Pomoฤ‡ni prostor O (1) O (1) O (1)
Tipiฤna upotreba Najmanje potrebno pisanja Poduฤavanje i uoฤavanje sortiranih podataka Mali ili gotovo sortirani nizovi

Tablica objaลกnjava uobiฤajeni odgovor na intervjuu. Sortiranje odabirom pobjeฤ‘uje u broju razmjena, mjehuriฤ‡asto sortiranje pobjeฤ‘uje u prepoznavanju ulaza koji je veฤ‡ ureฤ‘en, a sortiranje umetanjem obiฤno je najbrลพe od te tri metode u praksi jer su stvarni podaci ฤesto djelomiฤno sortirani. Nijedno od njih ne konkurira sortiranju spajanjem ili brzim sortiranjem nakon ลกto niz naraste preko nekoliko desetaka elemenata.

Pitanja i odgovori

Nakon n-1 prolaza, nesortirano podruฤje sadrลพi jedan element, a usamljeni element je veฤ‡ na svom ispravnom mjestu. Pokretanje joลก jednog prolaza ne bi niลกta usporedilo, pa granica petlje izbjegava uzaludnu iteraciju.

AI asistenti mogu rijeฤima prepriฤati svaki prolaz, izraditi dodatne testne nizove i brojati usporedbe za zadani ulaz. Koristite objaลกnjenje kao pomoฤ‡ pri uฤenju i provjerite svaku tvrdnju o sloลพenosti u odnosu na udลพbenik prije nego ลกto ga citirate.

Da. GitHub kopilot dovrลกava metodu iz potpisa ili komentara. Provjerite poฤetak unutarnje petlje i retke za zamjenu sami, jer generirane verzije ponekad zamjenjuju s i umjesto s pohranjenim minimalnim indeksom.

Verzija prikazana ovdje je nestabilna, jer zamjena na veliku udaljenost moลพe skoฤiti jednu jednaku vrijednost iza druge. Shiftblok elemenata umjesto zamjeneping ฤuva izvorni redoslijed jednakih kljuฤeva, po cijenu dodatnih zapisivanja.

Reverse usporedba unutar unutarnje petlje. Testiranje je li niz[j] veฤ‡i od niza[index] tracks najveฤ‡u preostalu vrijednost, pa svaki prolaz pomiฤe maksimum naprijed, a gotov niz ide od visoke prema niskoj vrijednosti.

Da. Rekurzivna metoda pronalazi minimum trenutnog podniza, zamjenjuje ga na poฤetku, a zatim poziva samu sebe na ostatku. Broj usporedbi ostaje nepromijenjen, ali stog poziva dodaje O(n) prostora, pa je oblik petlje poลพeljniji.

ฤŒeste greลกke su zaboravljanje resetiranja indeksa na i na poฤetku svakog prolaza, pokretanje unutarnje petlje na i umjesto na i + 1 i zamjenaping niz[j] umjesto niz[index], ลกto gubi track najmanje vrijednosti.

Ne. Arrays.sort() primjenjuje dual-pivot quicksort na primitive i TimSort na objekte, s sortiranjem umetanjem na malim particijama. Sortiranje odabirom pojavljuje se u nastavnim materijalima i ruฤno pisanom kodu, a ne u standardnoj biblioteci.

Saลพmite ovu objavu uz: