Udvalg Sortering i Java Program med eksempel

โšก Smart opsummering

Sortรฉr udvalget i Java scanner gentagne gange den usorterede del af et array, finder den mindste resterende vรฆrdi og bytter den om pรฅ sin plads, hvorved arbejdet fuldfรธres med hรธjst n-1 udvekslinger uanset inputrรฆkkefรธlgen.

  • ๐Ÿ”˜ Definition: Sortering med valg opdeler arrayet i et sorteret omrรฅde og et usorteret omrรฅde ved hver gennemgang.
  • โ˜‘๏ธ Proces: Hver gennemgang sรธger i det usorterede omrรฅde efter det laveste element og bytter det fremad.
  • โœ… Program: Java eksempel sorterer {860, 8, 200, 9} og udskriver alle sammenligninger og bytte.
  • ๐Ÿงช kompleksitet: Bedste, gennemsnitlige og vรฆrst tรฆnkelige tilfรฆlde kรธrer alle i O(nยฒ) tid, fordi sammenligningsantallet aldrig krymper.
  • ๐Ÿ› ๏ธ Hukommelse: Udvekslinger sker inden for det oprindelige array, sรฅ hjรฆlperummet forbliver ved O(1).
  • ๐Ÿ“Š Opfรธrsel: Den klassiske version er ustabil, men den udfรธrer fรฆrrest skrivninger af enhver kvadratisk slags.

Udvalg Sortering i Java Program med eksempel

Hvordan fungerer Selection Sort?

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

  • Algoritmen sรธger gentagne gange efter det laveste element.
  • Skift det nuvรฆrende element med et element med den laveste vรฆrdi
  • Ved hver iteration/gennemgang af udvรฆlgelsessortering, skiftes elementer.

Hvert gennemlรธb behandler derfor matrix som to regioner: en sorteret blok, der vokser fra venstre, og en usorteret blok, der krymper til hรธjre. Algoritmen gennemgรฅr den usorterede blok, husker indekset for den mindste vรฆrdi, den mรธder, og udveksler denne vรฆrdi med den fรธrste usorterede position.

Fordi der kun sker รฉn udveksling pr. gennemlรธb, ordnes et array af n elementer efter hรธjst n-1 udvekslinger. Det er denne egenskab, der adskiller denne rutine fra de andre rutiner pรฅ begynderniveau. Java sorteringsalgoritmer, som flytter data langt oftere.

tracFigur e nedenfor fรธlger eksempelmatrixen {860, 8, 200, 9} prรฆcis som programmet i nรฆste afsnit udskriver den under kรธrsel.

Pass Sammenligninger trykt Mindste vรฆrdi fundet Array efter byttet
Starten โ€” โ€” 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 vรฆrd at holde en pause ved dem. For det fรธrste rapporterer gennemgang 3 stadig en ombytning, selvom rรฆkkefรธlgen ikke รฆndres, fordi den mindste resterende vรฆrdi allerede befinder sig ved det aktuelle indeks, og programmet udveksler elementet med sig selv. For det andet falder antallet af sammenligninger med รฉn ved hver gennemgang (tre, derefter to, derefter รฉn), hvilket er mรธnsteret bag kompleksitetstallene lรฆngere nede pรฅ siden.

Java Program til at implementere Selection Sort

Klassen nedenfor hedder SelectionSortAlgo og findes i pakken com.guru99. main()-metoden deklarerer eksempelarrayet, udskriver det, sender det til selection() til sortering og udskriver det igen. Hjรฆlperen printArray() skriver alle elementer pรฅ en enkelt linje, hvilket er det, der producerer den lรฆsbare pass-by-pass-log.

Inde i selection() markerer den ydre lรธkke grรฆnsen mellem de sorterede og usorterede omrรฅder, variabelindekset holder positionen for den mindste vรฆrdi, der er set indtil videre, og de tre tildelinger i slutningen af โ€‹โ€‹hver gennemgang udfรธrer ombytningen.

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

Output:

Kompilering og kรธrsel af klassen producerer konsolloggen nedenfor med รฉn blok output pr. gennemlรธb.

------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 begyndere, nรฅr de kรธrer dette eksempel for fรธrste gang. Fordi filen deklarerer package com.guru99;, kilden skal leve i en matchende com/guru99 mappe, ellers rapporterer compileren en uoverensstemmelse mellem pakke- eller klassenavn. Klassen skal derefter startes med sit fuldt kvalificerede navn, java com.guru99.SelectionSortAlgo, fordi almindelig java SelectionSortAlgo rejser NoClassDefFoundError.

Lรธkkegrรฆnserne er den anden almindelige fรฆlde. Den ydre lรธkke stopper ved array.length - 1 og den indre lรธkke starter kl. i + 1; รฆndring af en af โ€‹โ€‹grรฆnserne producerer et ekstra tomt gennemlรธb eller en ArrayIndexOutOfBoundsException.

Tids- og rumkompleksitet af selektionssortering

Den indre lรธkke i programmet kรธrer altid til slutningen af โ€‹โ€‹arrayet, sรฅ algoritmen udfรธrer det samme antal sammenligninger, uanset hvordan dataene ser ud. For et array af n elementer er summen n(n-1)/2, hvilket for prรธven med fire elementer er lig med seks, og outputtet ovenfor udskriver faktisk prรฆcis seks sammenligningslinjer.

Kasse Sammenligninger Swaps Tidskompleksitet Hjรฆlperum
Bedste (array allerede sorteret) n(n-1)/2 n-1 O(nยฒ) O (1)
Gennemsnit (tilfรฆldig rรฆkkefรธlge) n(n-1)/2 n-1 O(nยฒ) O (1)
Vรฆrst (omvendt sortering) n(n-1)/2 n-1 O(nยฒ) O (1)

Tre konsekvenser fรธlger af den ensartede rรฆkke af tal:

  • Sortering af udvalg er ikke adaptiv. Sorteret input koster prรฆcis lige sรฅ meget som omvendt input, sรฅ der er ingen genvej til tidlig exit af den slags. boble sortering tilbud.
  • Antallet af bytter er algoritmens stรฆrke punkt. Der finder hรธjst n-1 bytter sted, hvilket er langt fรฆrre end det kvadratiske antal trรฆk, som andre simple sorteringer kan foretage.
  • Hukommelsesforbruget er konstant. Kun lรธkketรฆllerne og de to midlertidige variabler index og smallerNumber er nรธdvendige, sรฅ hjรฆlperummet er O(1), og sorteringen sker pรฅ stedet.

Den kvadratiske vรฆkst er den praktiske grรฆnse. Fordobling af arraystรธrrelsen firedobler omtrent sammenligningsarbejdet, sรฅ sortering af udvalg er mere egnet til undervisning, smรฅ arrays og indlejret kode end produktionsdatasรฆt, hvor O(n log n) algoritmer er det rigtige valg.

Fordele og ulemper ved selektionssortering

At forstรฅ, hvor algoritmen hjรฆlper, og hvor den gรธr ondt, gรธr det lettere at afgรธre, hvornรฅr det er rimeligt at rรฆkke ud efter den.

Fordele

  • Logikken er kort og lรฆsbar, hvilket er grunden til, at det er en standard fรธrste sorteringsรธvelse sidelรธbende med indsรฆtnings sortering.
  • Den sorterer pรฅ stedet, sรฅ der allokeres ikke et andet array, og hukommelsesforbruget vokser ikke med inputtet.
  • Den udfรธrer hรธjst n-1 skrivninger til arrayet, hvilket er vigtigt pรฅ storage, hvor skrivninger er langsomme eller slider pรฅ mediet.
  • Dens kรธretid er fuldstรฆndig forudsigelig, fordi sammenligningsantallet kun afhรฆnger af arrayets lรฆngde.

Ulemper

  • Hvert tilfรฆlde er O(nยฒ), sรฅ algoritmen skalerer ikke til store samlinger.
  • Den kan ikke registrere et allerede sorteret array og afslutter derfor aldrig for tidligt.
  • Den klassiske form vist ovenfor er ustabil, sรฅ to lige vรฆrdier kan ende i den modsatte rรฆkkefรธlge.
  • Den sammenligner oftere end indsรฆttelsessortering pรฅ nรฆsten ordnede data, hvor indsรฆttelsessortering nรฆrmer sig lineรฆr tid.

Kort sagt, vรฆlg sorteringssortering, nรฅr arrayet er lille, og hver skrivning er dyr, og undgรฅ det, nรฅr datasรฆttet er stort eller allerede tรฆt pรฅ sortering.

Sortering i forhold til udvalg Bubble-sortering vs. indsรฆttelsessortering

Alle tre algoritmer er kvadratiske, pรฅ stedet sammenligningstyper, men de opfรธrer sig forskelligt, nรฅr formen pรฅ inputtet รฆndrer sig.

Kriterium Sortering af udvalg Bubble-sortering Indsรฆttelsessortering
Bedste-case tid O(nยฒ) O (n) O (n)
Gennemsnitlig og worst-case tid O(nยฒ) O(nยฒ) O(nยฒ)
Bytter eller skift i vรฆrste fald n-1 swaps n(n-1)/2 swaps Op til n(n-1)/2 skift
Stabil Ingen Ja Ja
Adaptiv til sorteret input Ingen Ja Ja
Hjรฆlperum O (1) O (1) O (1)
Typisk brug Fรฆrrest nรธdvendige skriverier Undervisning og spotting af sorterede data Smรฅ eller nรฆsten sorterede arrays

Tabellen forklarer et almindeligt interviewsvar. Udvรฆlgelsessortering vinder pรฅ antallet af udvekslinger, boblesortering vinder pรฅ genkendelse af input, der allerede er ordnet, og indsรฆttelsessortering er normalt den hurtigste af de tre i praksis, fordi reelle data ofte er delvist sorteret. Ingen af โ€‹โ€‹dem konkurrerer med mergesortering eller quicksortering, nรฅr arrayet vokser forbi et par dusin elementer.

Ofte Stillede Spรธrgsmรฅl

Efter n-1 gennemlรธb indeholder den usorterede region et enkelt element, og et ensomt element er allerede pรฅ sin korrekte plads. At kรธre endnu et gennemlรธb ville ikke sammenligne noget, sรฅ lรธkkebindingen undgรฅr en spildt iteration.

AI-assistenter kan fortรฆlle hver gennemgang med ord, bygge ekstra testarrays og tรฆlle sammenligninger for et givet input. Brug forklaringen som et studiehjรฆlpemiddel, og bekrรฆft enhver pรฅstand om kompleksitet i forhold til en lรฆrebog, fรธr du citerer den.

Ja. GitHub Copilot fuldfรธrer metoden fra en signatur eller kommentar. Tjek selv den indre lรธkkestart og swap-linjerne, fordi genererede versioner nogle gange bytter med i i stedet for med det gemte minimumsindeks.

Den viste version er ustabil, fordi en langdistance-swap kan hoppe en lige vรฆrdi over en anden. Shiftat bruge blokken af โ€‹โ€‹elementer i stedet for at bytteping bevarer den oprindelige rรฆkkefรธlge af lige nรธgler, pรฅ bekostning af ekstra skrivninger.

Reverse sammenligningen i den indre lรธkke. Test af om array[j] er stรธrre end array[index] tracks den stรธrste resterende vรฆrdi, sรฅ hver gennemgang flytter det maksimale fremad, og det fรฆrdige array kรธrer fra hรธj til lav.

Ja. En rekursiv metode finder minimummet for det aktuelle subarray, bytter det ind i fronten og kalder derefter sig selv pรฅ resten. Sammenligningstรฆllingen er uรฆndret, men kaldstakken tilfรธjer O(n) plads, sรฅ lรธkkeformen foretrรฆkkes.

De hyppigste fejl er, at man glemmer at nulstille indekset til i ved starten af โ€‹โ€‹hver gennemgang, starter den indre lรธkke ved i i stedet for i + 1, og bytterping array[j] i stedet for array[index], hvilket taber track af den mindste vรฆrdi.

Nej. Arrays.sort() anvender en dobbelt-pivot quicksort pรฅ primitiver og TimSort pรฅ objekter, med en indsรฆttelseslignende sortering pรฅ smรฅ partitioner. Udvรฆlgelsessortering vises i undervisningsmateriale og hรฅndskrevet kode i stedet for i standardbiblioteket.

Opsummer dette indlรฆg med: