Urval Sortera in Java Program med exempel
โก Smart sammanfattning
Sortera urvalet i Java skannar upprepade gรฅnger den osorterade delen av en array, hittar det minsta รฅterstรฅende vรคrdet och byter ut det pรฅ sin plats, vilket slutfรถr arbetet med hรถgst n-1 byten oavsett inmatningsordningen.
Hur fungerar urvalssortering?
Selection Sort implementerar en enkel sorteringsalgoritm enligt fรถljande:
- Algoritmen sรถker upprepade gรฅnger efter det lรคgsta elementet.
- Byt aktuellt element med ett element som har det lรคgsta vรคrdet
- Med varje iteration/pass av urvalssort byts element.
Varje pass behandlar dรคrfรถr array som tvรฅ regioner: ett sorterat block som vรคxer frรฅn vรคnster och ett osorterat block som krymper till hรถger. Algoritmen gรฅr igenom det osorterade blocket, kommer ihรฅg indexet fรถr det minsta vรคrde det mรถter och byter ut det vรคrdet med den fรถrsta osorterade positionen.
Eftersom endast ett utbyte sker per pass, ordnas en array av n element efter hรถgst n-1 utbyten. Det รคr den egenskapen som skiljer denna rutinen frรฅn de andra nybรถrjarnivรฅrutinerna. Java sorteringsalgoritmer, som flyttar data mycket oftare.
Ocuco-landskapet trace nedan fรถljer exempelmatrisen {860, 8, 200, 9} exakt sรฅ som programmet i nรคsta avsnitt skriver ut den vid kรถrning.
| Pass | Jรคmfรถrelser tryckta | Minsta vรคrde hittat | Array efter bytet |
|---|---|---|---|
| Start | - | - | 860 8 200 9 |
| 1 | 860 och 8, 8 och 200, 8 och 9 | 8 | 8 860 200 9 |
| 2 | 860 och 200, 200 och 9 | 9 | 8 9 200 860 |
| 3 | 200 och 860 | 200 | 8 9 200 860 |
Tvรฅ detaljer i det tracDet รคr vรคrt att pausa vid dem. Fรถr det fรถrsta rapporterar pass 3 fortfarande ett byte รคven om ordningen inte รคndras, eftersom det minsta รฅterstรฅende vรคrdet redan finns vid det aktuella indexet och programmet byter elementet med sig sjรคlvt. Fรถr det andra minskar antalet jรคmfรถrelser med ett vid varje pass (tre, sedan tvรฅ, sedan en), vilket รคr mรถnstret bakom komplexitetssiffrorna lรคngre ner pรฅ sidan.
Java Program fรถr att implementera urvalssortering
Klassen nedan heter SelectionSortAlgo och finns i paketet com.guru99. main()-metoden deklarerar exempelarrayen, skriver ut den, skickar den till selection() fรถr sortering och skriver ut den igen. Hjรคlparen printArray() skriver alla element pรฅ en enda rad, vilket รคr det som producerar den lรคsbara pass-by-pass-loggen.
Inuti selection() markerar den yttre loopen grรคnsen mellan de sorterade och osorterade omrรฅdena, variabelindexet hรฅller positionen fรถr det minsta vรคrdet som hittills setts, och de tre tilldelningarna i slutet av varje omgรฅng utfรถr vรคxlingen.
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(); } }
Produktion:
Att kompilera och kรถra klassen producerar konsolloggen nedan, med ett block 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
Tvรฅ problem รถverraskar nybรถrjare nรคr de kรถr det hรคr exemplet fรถr fรถrsta gรฅngen. Eftersom filen deklarerar package com.guru99;, kรคllan mรฅste finnas i en matchande com/guru99 katalog, annars rapporterar kompilatorn en matchning mellan paket- eller klassnamn. Klassen mรฅste dรฅ startas med sitt fullstรคndiga namn, java com.guru99.SelectionSortAlgo, eftersom vanligt java SelectionSortAlgo genererar NoClassDefFoundError.
Loopgrรคnserna รคr den andra vanliga fรคllan. Den yttre loopen stannar vid array.length - 1 och den inre slingan bรถrjar kl. i + 1; om man รคndrar endera grรคnsen produceras ett extra tomt pass eller ett ArrayIndexOutOfBoundsException.
Tids- och rumskomplexitet fรถr urvalssortering
Den inre loopen i programmet kรถrs alltid till slutet av arrayen, sรฅ algoritmen utfรถr samma antal jรคmfรถrelser oavsett hur data ser ut. Fรถr en array med n element รคr den totala mรคngden n(n-1)/2, vilket fรถr urvalet med fyra element รคr lika med sex, och utdata ovan skriver faktiskt ut exakt sex jรคmfรถrelserader.
| Case | jรคmfรถrelser | swappar | Tidskomplexitet | Hjรคlputrymme |
|---|---|---|---|---|
| Bรคst (matrisen รคr redan sorterad) | n(n-1)/2 | N 1 | O(nยฒ) | O (1) |
| Genomsnitt (slumpmรคssig ordning) | n(n-1)/2 | N 1 | O(nยฒ) | O (1) |
| Sรคmst (omvรคnd sortering) | n(n-1)/2 | N 1 | O(nยฒ) | O (1) |
Tre konsekvenser fรถljer av den enhetliga raden av siffror:
- Sortering av urval รคr inte adaptiv. Sorterad inmatning kostar exakt lika mycket som omvรคnd inmatning, sรฅ det finns ingen genvรคg fรถr tidig avstรคngning av det slaget. bubbelsorter erbjudanden.
- Antalet byten รคr algoritmens styrka. Som mest sker n-1 byten, vilket รคr betydligt fรคrre รคn det kvadratiska antalet drag som andra enkla sorteringar kan gรถra.
- Minnesanvรคndningen รคr konstant. Endast looprรคknarna och de tvรฅ temporรคra variablerna index och smallerNumber behรถvs, sรฅ hjรคlputrymmet รคr O(1) och sorteringen sker pรฅ plats.
Den kvadratiska tillvรคxten รคr den praktiska grรคnsen. Att fรถrdubla arraystorleken fyrdubblar ungefรคr jรคmfรถrelsearbetet, sรฅ urvalssortering passar undervisning, smรฅ arrayer och inbรคddad kod snarare รคn produktionsdatauppsรคttningar, dรคr O(n log n) algoritmer รคr det rรคtta valet.
Fรถrdelar och nackdelar med urvalssortering
Att fรถrstรฅ var algoritmen hjรคlper och var den gรถr ont gรถr det lรคttare att avgรถra nรคr det รคr rimligt att anvรคnda den.
Fรถrdelar
- Logiken รคr kort och lรคttlรคst, vilket รคr anledningen till att det รคr en standard fรถrsta sorteringsรถvning vid sidan av insรคttningssortering.
- Den sorterar pรฅ plats, sรฅ ingen andra array allokeras och minnesanvรคndningen vรคxer inte med indata.
- Den utfรถr som mest n-1 skrivningar till arrayen, vilket รคr viktigt vid lagring dรคr skrivningarna รคr lรฅngsamma eller sliter ut mediet.
- Dess kรถrtid รคr helt fรถrutsรคgbar, eftersom jรคmfรถrelseantalet endast beror pรฅ arraylรคngden.
Nackdelar
- Varje fall รคr O(nยฒ), sรฅ algoritmen skalar inte till stora samlingar.
- Den kan inte upptรคcka en redan sorterad array och avslutas dรคrfรถr aldrig fรถr tidigt.
- Den klassiska formen som visas ovan รคr instabil, sรฅ tvรฅ lika vรคrden kan hamna i motsatt ordning.
- Den jรคmfรถr oftare รคn insรคttningssortering pรฅ nรคstan ordnad data, dรคr insรคttningssortering nรคrmar sig linjรคr tid.
Kort sagt, vรคlj sorteringssortering nรคr arrayen รคr liten och varje skrivning รคr dyr, och undvik det nรคr datamรคngden รคr stor eller redan nรคra sortering.
Sortera urval vs. Bubble-sortering kontra insรคttningssortering
Alla tre algoritmerna รคr kvadratiska, pรฅ plats jรคmfรถrelsetyper, men de beter sig olika nรคr ingรฅngens form รคndras.
| Kriterium | Sortera urvalet | Bubble-sortering | Insรคttningssort |
|---|---|---|---|
| Bรคsta tรคnkbara tidpunkt | O(nยฒ) | O (n) | O (n) |
| Genomsnittlig och vรคrsta tรคnkbara tid | O(nยฒ) | O(nยฒ) | O(nยฒ) |
| Byten eller fรถrflyttningar i vรคrsta fall | n-1-byten | n(n-1)/2 swappar | Upp till n(n-1)/2 skift |
| Stabil | Nej | Ja | Ja |
| Anpassningsbar till sorterad inmatning | Nej | Ja | Ja |
| Hjรคlputrymme | O (1) | O (1) | O (1) |
| Typisk anvรคndning | Minst antal skrivningar krรคvs | Undervisning och identifiering av sorterade data | Smรฅ eller nรคstan sorterade matriser |
Tabellen fรถrklarar ett vanligt intervjusvar. Urvalssortering vinner pรฅ antalet utbyten, bubbelsortering vinner pรฅ att kรคnna igen inmatning som redan รคr ordnad, och insรคttningssortering รคr vanligtvis den snabbaste av de tre i praktiken eftersom verklig data ofta รคr delvis sorterad. Ingen av dem konkurrerar med sammanslagningssortering eller snabbsortering nรคr arrayen vรคxer fรถrbi nรฅgra dussin element.
