Valik Sorteerimine Java Programm näitega

⚡ Nutikas kokkuvõte

Valiku sortimine Java skannib korduvalt massiivi sorteerimata osa, leiab väikseima allesjäänud väärtuse ja asetab selle õigesse kohta, lõpetades töö maksimaalselt n-1 vahetusega, olenemata sisendjärjekorrast.

  • 🔘 Määratlus: Valiku sortimine jagab massiivi igal läbimisel sorteeritud ja sortimata piirkonnaks.
  • ☑️ Protsess: Iga läbimine otsib sorteerimata piirkonnast madalaima elemendi ja vahetab selle edasi.
  • Programm: . Java näide sorteerib {860, 8, 200, 9} ja prindib kõik võrdlused ja vahetustehingud.
  • 🧪 Keerukus: Parima, keskmise ja halvima juhtumi arvutused tehakse kõik O(n²) ajaga, sest võrdluste arv ei kahane kunagi.
  • 🛠️ Mälu: Vahetused toimuvad algse massiivi sees, seega jääb abiruum O(1)-ks.
  • 📊 Käitumine: Klassikaline versioon on ebastabiilne, kuid see teeb kõige vähem ruuttüüpi kirjutusi.

Valik Sorteerimine Java Programm näitega

Kuidas valiku sortimine töötab?

Valiku sortimine rakendab lihtsat sortimisalgoritmi järgmiselt:

  • Algoritm otsib korduvalt madalaimat elementi.
  • Vahetage praegune element madalaima väärtusega elemendiga
  • Iga valiku sortimise iteratsiooni/käiguga vahetatakse elemente.

Seega kohtleb iga läbimine massiivi kahe piirkonnana: vasakult kasvav sorteeritud plokk ja paremalt kahanev sortimata plokk. Algoritm käib läbi sorteerimata ploki, jätab meelde väikseima kohatud väärtuse indeksi ja vahetab selle väärtuse esimese sorteerimata positsiooniga.

Kuna iga käigu kohta toimub ainult üks vahetus, järjestatakse n elemendist koosnev massiiv maksimaalselt n-1 vahetuse järel. See omadus eristab seda rutiini teistest algajate taseme rutiinidest. Java sorteerimisalgoritmid, mis liigutavad andmeid palju sagedamini.

. tracAllolev e järgib näidismassiivi {860, 8, 200, 9} täpselt nii, nagu järgmises jaotises olev programm selle käitusajal välja prindib.

Sooritama Trükitud võrdlused Väikseim leitud väärtus Massiiv pärast vahetust
Avaleht - - 860 8 200 9
1 860 ja 8, 8 ja 200, 8 ja 9 8 8 860 200 9
2 860 ja 200, 200 ja 9 9 8 9 200 860
3 200 ja 860 200 8 9 200 860

Kaks detaili selles trace-l tasub peatuda. Esiteks, 3. käik teatab ikkagi vahetusest, isegi kui järjekord ei muutu, sest väikseim allesjäänud väärtus asub juba praeguses indeksis ja programm vahetab elemendi iseendaga. Teiseks, võrdluste arv väheneb igal käigul ühe võrra (kolm, siis kaks, siis üks), mis ongi lehel allpool olevate keerukusarvude taga olev muster.

Java Programm valiku sortimise rakendamiseks

Allolev klass kannab nime SelectionSortAlgo ja asub paketis com.guru99. Meetod main() deklareerib näidismassiivi, prindib selle, annab selle sortimiseks funktsioonile selection() ja prindib uuesti. Abimeetod printArray() kirjutab kõik elemendid ühele reale, mis loob loetava möödamineku-läbimise logi.

Funktsiooni selection() sees tähistab välimine tsükkel sorteeritud ja sorteerimata piirkondade vahelist piiri, muutuja index hoiab seni nähtud väikseima väärtuse positsiooni ja iga tsükli lõpus olevad kolm omistamist teostavad vahetuse.

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

Väljund:

Klassi kompileerimine ja käivitamine loob alloleva konsooli logi, kus iga käik sisaldab ühte väljundplokki.

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

Selle näite esmakordsel käivitamisel tekivad algajatele kaks probleemi. Kuna fail deklareerib package com.guru99;, peab allikas asuma sobivas keskkonnas com/guru99 kataloogis, vastasel juhul teatab kompilaator paketi või klassi nime mittevastavusest. Seejärel tuleb klass käivitada selle täielikult kvalifitseeritud nimega, java com.guru99.SelectionSortAlgo, sest tavaline java SelectionSortAlgo tekitab NoClassDefFoundError vea.

Tsükli piirid on teine ​​levinud lõks. Välimine tsükkel peatub array.length - 1 ja sisemine ring algab i + 1Kummagi piiri muutmine tekitab täiendava tühja käigu või ArrayIndexOutOfBoundsExceptioni.

Valiku sortimise ajaline ja ruumiline keerukus

Programmi sisemine tsükkel jookseb alati massiivi lõpuni, seega teeb algoritm sama arvu võrdlusi, olenemata andmete väljanägemisest. n-elemendilise massiivi puhul on see summa n(n-1)/2, mis neljaelemendilise valimi puhul võrdub kuuega, ja ülaltoodud väljund prindib tõepoolest täpselt kuus võrdlusrida.

juhtum Võrdlused Vahetustehingud Aja keerukus Abiruum
Parim (massiiv on juba sorteeritud) n(n-1)/2 n-1 O(n²) O (1)
Keskmine (juhuslikus järjekorras) n(n-1)/2 n-1 O(n²) O (1)
Halvim (vastupidiselt sorteeritud) n(n-1)/2 n-1 O(n²) O (1)

Sellest ühtlasest arvude reast tulenevad kolm tagajärge:

  • Valikuga sortimine ei ole adaptiivne. Sorteeritud sisend maksab täpselt sama palju kui vastupidine sisend, seega puudub selline varajase väljumise otsetee. mulli sorteerimine pakub.
  • Algoritmi tugev külg on vahetuste arv. Maksimaalselt toimub n-1 vahetust, mis on palju vähem kui ruutkäiguarv, mida teised lihtsad sortimised suudavad teha.
  • Mälukasutus on konstantne. Vaja on ainult tsükli loendureid ja kahte ajutist muutujat index ja smallerNumber, seega on abiruum O(1) ja sortimine toimub kohapeal.

Ruutkasv on praktiline piir. Massiivi suuruse kahekordistamine neljakordistab võrdlustöö, seega sobib valiksortimine õpetamiseks, väikesteks massiivideks ja manustatud koodiks, mitte aga tootmisandmekogumiteks, kus O(n log n) algoritmid on õige valik.

Valikulise sortimise eelised ja puudused

Algoritmi abi ja kahju mõistmine lihtsustab otsustamist, millal on selle poole pöördumine mõistlik.

Eelised

  • Loogika on lühike ja loetav, mistõttu on see standardne esimene sorteerimisülesanne koos sisestamise sort.
  • See sorteerib kohapeal, seega teist massiivi ei eraldata ja mälukasutus ei kasva sisendiga.
  • See teeb massiivi maksimaalselt n-1 kirjutustoimingut, mis on oluline salvestusruumide puhul, kus kirjutamine on aeglane või kulutab andmekandjat.
  • Selle tööaeg on täiesti etteaimatav, kuna võrdluste arv sõltub ainult massiivi pikkusest.

Puudused

  • Iga juhtum on O(n²), seega algoritm ei skaleeru suurtele kogumitele.
  • See ei suuda tuvastada juba sorteeritud massiivi ja seetõttu ei lõpeta see kunagi varem.
  • Ülaltoodud klassikaline vorm on ebastabiilne, seega kaks võrdset väärtust võivad lõpuks olla vastupidises järjekorras.
  • See võrdleb sagedamini kui sisestussortimine peaaegu järjestatud andmete puhul, kus sisestussortimine läheneb lineaarsele ajale.

Lühidalt, vali valikupõhine sortimine, kui massiiv on väike ja iga kirjutamine on kulukas, ning väldi seda juhul, kui andmestik on suur või juba peaaegu sorteeritud.

Valiku sortimine vs Bubble-sortimine vs sisestussortimine

Kõik kolm algoritmi on ruutpõhised, kohapealsed võrdlussorteerimised, kuid käituvad erinevalt, kui sisendi kuju muutub.

Kriteerium Valiku sortimine Bubble-sorteerimine Sisestuse sortimine
Parim võimalik aeg O(n²) O (n) O (n)
Keskmine ja halvimal juhul aeg O(n²) O(n²) O(n²)
Vahetused või halvimal juhul nihutamine n-1 vahetustehingud n(n-1)/2 vahetust Kuni n(n-1)/2 vahetust
Stabiilne Ei Jah Jah
Kohanduv sorteeritud sisendi suhtes Ei Jah Jah
Abiruum O (1) O (1) O (1)
Tüüpiline kasutamine Vaja läheb kõige vähem kirjutusi Sorteeritud andmete õpetamine ja märgistamine Väikesed või peaaegu sorteeritud massiivid

Tabel selgitab levinud intervjuuvastust. Valiksortimine on edukas vahetuste arvu poolest, mullsortimine juba järjestatud sisendi tuvastamise poolest ja sisestussortimine on praktikas neist kolmest tavaliselt kiireim, kuna reaalsed andmed on sageli osaliselt sorteeritud. Ükski neist ei konkureeri liitmissortimise ega kiirsortimisega, kui massiiv kasvab üle mõnekümne elemendi.

KKK

Pärast n-1 läbimist sisaldab sorteerimata piirkond ühte elementi ja üksik element on juba oma õigel kohal. Veel ühe läbimise korral ei võrreldaks midagi, seega väldib tsükliga seotud funktsioon raisatud iteratsiooni.

Tehisintellekti assistendid saavad iga läbimist sõnadega edasi jutustada, luua täiendavaid testimismassiive ja lugeda antud sisendi võrdlusi. Kasutage selgitust õppevahendina ja kinnitage enne õpiku tsiteerimist kõik keerukusväited.

Jah. GitHubi koopia lõpetab meetodi signatuuri või kommentaari põhjal. Kontrolli sisemise tsükli algust ja vahetusridu ise, sest genereeritud versioonid vahetavad mõnikord i-ga, mitte salvestatud minimaalse indeksiga.

Siin näidatud versioon on ebastabiilne, kuna pikamaa vahetus võib ühe võrdse väärtuse võrra teisest mööda hüpata. Shiftelementide ploki vahetamine vahetamise asemelping säilitab võrdsete võtmete algse järjekorra täiendavate kirjutustoimingute hinnaga.

Reverse võrdlus sisemise tsükli sees. Testimine, kas array[j] on suurem kui array[index] tracks suurima järelejäänud väärtuse, seega iga läbimine nihutab maksimumi edasi ja valmis massiiv jookseb kõrgeimast madalaimale.

Jah. Rekursiivne meetod leiab praeguse alammassiivi miinimumi, asetab selle ettepoole ja kutsub seejärel jäägi põhjal ennast välja. Võrdluste arv jääb samaks, kuid väljakutsete pinu lisab O(n) ruumi, seega on eelistatud tsükli vorm.

Sagedasemad vead on indeksi i-le lähtestamise unustamine iga läbimise alguses, sisemise tsükli alustamine i-st i + 1 asemel ja indeksi vahetamine.ping massiiv[j], mitte massiiv[index], mis kaotab track väikseimast väärtusest.

Ei. Arrays.sort() rakendab primitiividele kahekordse pöördliigendiga kiirsortimist ja objektidele TimSorti, väikeste partitsioonide puhul aga lisamisstiilis sortimist. Valiksortimine esineb õppematerjalides ja käsitsi kirjutatud koodis, mitte standardteegis.

Võta see postitus kokku järgmiselt: