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