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