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