Utvalg Sorterer inn Java Program med eksempel

โšก Smart oppsummering

Sorter utvalget i Java skanner gjentatte ganger den usorterte delen av en matrise, finner den minste gjenvรฆrende verdien og bytter den til riktig posisjon, og fullfรธrer arbeidet med maksimalt n-1 utvekslinger uavhengig av inndatarekkefรธlgen.

  • ๐Ÿ”˜ Definisjon: Utvalgssortering deler matrisen inn i et sortert omrรฅde og et usortert omrรฅde ved hver omgang.
  • โ˜‘๏ธ Prosess: Hver omgang sรธker i det usorterte omrรฅdet etter det laveste elementet og bytter det fremover.
  • โœ… Program: Ocuco Java eksempel sorterer {860, 8, 200, 9} og skriver ut alle sammenligninger og bytter.
  • ๐Ÿงช kompleksitet: Beste, gjennomsnittlige og verste tilfeller kjรธrer alle i O(nยฒ) tid fordi sammenligningsantallet aldri krymper.
  • ๐Ÿ› ๏ธ Minne: Utvekslinger skjer inne i den opprinnelige tabellen, sรฅ hjelperommet forblir pรฅ O(1).
  • ๐Ÿ“Š Oppfรธrsel: Den klassiske versjonen er ustabil, men den utfรธrer fรฆrrest skrivinger av alle kvadratiske typer.

Utvalg Sorterer inn Java Program med eksempel

Hvordan fungerer utvalgssortering?

Selection Sort implementerer en enkel sorteringsalgoritme som fรธlger:

  • Algoritmen sรธker gjentatte ganger etter det laveste elementet.
  • Bytt gjeldende element med et element som har den laveste verdien
  • Med hver iterasjon/passering av utvalgssortering, byttes elementer.

Hvert pass behandler derfor matrise som to regioner: en sortert blokk som vokser fra venstre og en usortert blokk som krymper til hรธyre. Algoritmen gรฅr gjennom den usorterte blokken, husker indeksen for den minste verdien den mรธter, og bytter den verdien med den fรธrste usorterte posisjonen.

Fordi bare รฉn utveksling skjer per omgang, blir en matrise med n elementer ordnet etter maksimalt n-1 bytter. Det er denne egenskapen som skiller denne rutinen fra de andre rutinene pรฅ nybegynnernivรฅ. Java sorteringsalgoritmer, som flytter data mye oftere.

Ocuco trace nedenfor fรธlger eksempelmatrisen {860, 8, 200, 9} nรธyaktig slik programmet i neste avsnitt skriver den ut under kjรธretid.

Pass Sammenligninger trykt Minste verdi funnet Array etter byttet
Start - - 860 8 200 9
1 860 og 8, 8 og 200, 8 og 9 8 8 860 200 9
2 860 og 200, 200 og 9 9 8 9 200 860
3 200 og 860 200 8 9 200 860

To detaljer i det tracDet er verdt รฅ stoppe opp. For det fรธrste rapporterer gjennomgang 3 fortsatt en bytte selv om rekkefรธlgen ikke endres, fordi den minste gjenvรฆrende verdien allerede er pรฅ gjeldende indeks og programmet bytter elementet med seg selv. For det andre faller antallet sammenligninger med รฉn pรฅ hver gjennomgang (tre, deretter to, deretter รฉn), som er mรธnsteret bak kompleksitetstallene lenger ned pรฅ siden.

Java Program for รฅ implementere Selection Sort

Klassen nedenfor heter SelectionSortAlgo og ligger i pakken com.guru99. main()-metoden deklarerer eksempelarrayet, skriver det ut, gir det til selection() for sortering og skriver det ut pรฅ nytt. Hjelpefunksjonen printArray() skriver alle elementene pรฅ รฉn linje, som er det som produserer den lesbare pass-by-pass-loggen.

Inne i selection() markerer den ytre lรธkken grensen mellom de sorterte og usorterte omrรฅdene, variabelindeksen holder posisjonen til den minste verdien som er sett sรฅ langt, og de tre tildelingene pรฅ slutten av hver omgang utfรธrer byttet.

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();
	    
	}
 
}

Utgang:

Kompilering og kjรธring av klassen produserer konsollloggen nedenfor, med รฉn blokk med utdata per pass.

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

To problemer fanger nybegynnere nรฅr de kjรธrer dette eksemplet for fรธrste gang. Fordi filen deklarerer package com.guru99;, kilden mรฅ befinne seg i en samsvarende com/guru99 katalog, ellers rapporterer kompilatoren en feilmatching av pakke- eller klassenavn. Klassen mรฅ da startes med sitt fullstendige navn, java com.guru99.SelectionSortAlgo, fordi vanlig java SelectionSortAlgo hever NoClassDefFoundError.

Lรธkkegrensene er den andre vanlige fellen. Den ytre lรธkken stopper ved array.length - 1 og den indre slรธyfen starter kl. i + 1; endring av en av grensene produserer et ekstra tomt pass eller en ArrayIndexOutOfBoundsException.

Tids- og romkompleksitet ved utvalgssortering

Den indre lรธkken i programmet gรฅr alltid til slutten av tabellen, sรฅ algoritmen utfรธrer samme antall sammenligninger uansett hvordan dataene ser ut. For en tabell med n elementer er summen n(n-1)/2, som for prรธven med fire elementer er lik seks, og resultatet ovenfor skriver faktisk ut nรธyaktig seks sammenligningslinjer.

Sak Sammenligninger swaps Tidskompleksitet Hjelpeplass
Best (matrisen er allerede sortert) n(n-1)/2 n-1 O(nยฒ) O (1)
Gjennomsnitt (tilfeldig rekkefรธlge) n(n-1)/2 n-1 O(nยฒ) O (1)
Verst (omvendt sortering) n(n-1)/2 n-1 O(nยฒ) O (1)

Tre konsekvenser fรธlger av den ensartede rekken med tall:

  • Sortering av utvalg er ikke adaptiv. Sortert inndata koster nรธyaktig like mye som omvendt inndata, sรฅ det finnes ingen snarvei til tidlig avslutning av den typen. boblesortering tilbud.
  • Bytteantall er algoritmens sterke punkt. Pรฅ det meste finner n-1 bytter sted, noe som er langt fรฆrre enn det kvadratiske antallet trekk andre enkle sorteringer kan gjรธre.
  • Minnebruken er konstant. Bare lรธkketellerne og de to midlertidige variablene index og smallerNumber er nรธdvendige, sรฅ hjelperommet er O(1) og sorteringen skjer pรฅ stedet.

Den kvadratiske veksten er den praktiske grensen. Dobling av arraystรธrrelsen firedobler omtrent sammenligningsarbeidet, sรฅ utvalgssortering passer bedre til undervisning, smรฅ arrayer og innebygd kode enn produksjonsdatasett, der O(n log n) algoritmer er det riktige valget.

Fordeler og ulemper med utvalgssortering

ร… forstรฅ hvor algoritmen hjelper og hvor den skader gjรธr det lettere รฅ avgjรธre nรฅr det er rimelig รฅ strekke seg etter den.

Fordeler

  • Logikken er kort og lesbar, og det er derfor det er en standard fรธrste sorteringsรธvelse ved siden av innsettings sortering.
  • Den sorterer pรฅ plass, sรฅ ingen andre array blir tildelt og minnebruken vokser ikke med inputen.
  • Den utfรธrer maksimalt n-1 skrivinger til arrayet, noe som er viktig pรฅ lagring der skrivingene er trege eller sliter ut mediet.
  • Kjรธretiden er fullstendig forutsigbar, fordi sammenligningsantallet bare avhenger av arraylengden.

Ulemper

  • Hvert tilfelle er O(nยฒ), sรฅ algoritmen skalerer ikke til store samlinger.
  • Den kan ikke oppdage en allerede sortert matrise og fullfรธres derfor aldri for tidlig.
  • Den klassiske formen vist ovenfor er ustabil, sรฅ to like verdier kan ende opp i motsatt rekkefรธlge.
  • Den sammenligner oftere enn innsettingssortering pรฅ nesten ordnede data, der innsettingssortering nรฆrmer seg lineรฆr tid.

Kort sagt, velg utvalgssortering nรฅr arrayet er lite og hver skriving er dyr, og unngรฅ det nรฅr datasettet er stort eller allerede nรฆr sortering.

Utvalg Sortering vs. Bubble-sortering vs. innsettingssortering

Alle tre algoritmene er kvadratiske, pรฅ-sted-sammenligningstyper, men de oppfรธrer seg annerledes nรฅr formen pรฅ inngangen endres.

Criterion Sortering av utvalg Bubble-sortering Innfรธringssortering
Best-case tidspunkt O(nยฒ) O (n) O (n)
Gjennomsnittlig og verst tenkelig tid O(nยฒ) O(nยฒ) O(nยฒ)
Bytter eller forskyvninger i verste fall n-1 bytter n(n-1)/2 bytter Opptil n(n-1)/2 skift
Stabil Nei Ja Ja
Adaptiv til sortert inndata Nei Ja Ja
Hjelpeplass O (1) O (1) O (1)
Typisk bruk Fรฆrrest skriving kreves Undervisning og identifisering av sorterte data Smรฅ eller nesten sorterte matriser

Tabellen forklarer et vanlig intervjusvar. Utvalgssortering vinner pรฅ antall utvekslinger, boblesortering vinner pรฅ gjenkjenning av input som allerede er ordnet, og innsettingssortering er vanligvis den raskeste av de tre i praksis fordi reelle data ofte er delvis sortert. Ingen av dem konkurrerer med mergesortering eller quicksortering nรฅr arrayet vokser forbi noen fรฅ dusin elementer.

Spรธrsmรฅl og svar

Etter n-1 passeringer inneholder den usorterte regionen et enkelt element, og et enslig element er allerede pรฅ riktig plass. ร… kjรธre ett passering til ville ikke sammenligne noe, sรฅ lรธkkebindingen unngรฅr en bortkastet iterasjon.

AI-assistenter kan gjengi hver bestรฅtte bestรฅtthet med ord, bygge ekstra testmatriser og telle sammenligninger for en gitt input. Bruk forklaringen som et studiehjelpemiddel og bekreft eventuelle pรฅstander om kompleksitet mot en lรฆrebok fรธr du siterer den.

Ja. GitHub Copilot fullfรธrer metoden fra en signatur eller kommentar. Sjekk starten av den indre lรธkken og byttelinjene selv, fordi genererte versjoner noen ganger bytter med i i stedet for med den lagrede minimumsindeksen.

Versjonen som vises her er ustabil, fordi en langdistansebytte kan hoppe รฉn lik verdi forbi en annen. Shiftรฅ bruke blokken med elementer i stedet for รฅ bytteping bevarer den opprinnelige rekkefรธlgen av like nรธkler, pรฅ bekostning av ekstra skrivinger.

Reverse sammenligningen i den indre lรธkken. Testing av om array[j] er stรธrre enn array[index] tracks den stรธrste gjenvรฆrende verdien, sรฅ hver passering flytter maksimumet fremover og den ferdige matrisen gรฅr fra hรธy til lav.

Ja. En rekursiv metode finner minimumet til den gjeldende undermatrisen, bytter den inn i fronten og kaller seg selv pรฅ resten. Sammenligningstallet er uendret, men kallstakken legger til O(n)-plass, sรฅ lรธkkeformen er รฅ foretrekke.

De hyppige feilene er at man glemmer รฅ tilbakestille indeksen til i ved starten av hver omgang, starter den indre slรธyfen ved i i stedet for i + 1, og bytterping array[j] i stedet for array[index], som mister track av den minste verdien.

Nei. Arrays.sort() bruker en hurtigsortering med dobbel pivot pรฅ primitiver og TimSort pรฅ objekter, med en innsettingssortering pรฅ smรฅ partisjoner. Utvalgssortering vises i undervisningsmateriell og hรฅndskrevet kode i stedet for i standardbiblioteket.

Oppsummer dette innlegget med: