Sortiranje odabira na Javi

1. Uvod

U ovom uputstvu ćemo nauči Sortiranje odabira, pogledajte njegovu implementaciju u Javi i analizirajte njezinu izvedbu.

2. Pregled algoritma

Sortiranje odabira započinje elementom na 1. položaju nerazvrstani niz i skenira kroz sljedeće elemente u pronaći najmanji element. Jednom pronađen, najmanji element zamijenjen je elementom na 1. mjestu.

Algoritam se zatim prebacuje na element na 2. položaju i pregledava sljedeće elemente kako bi pronašao indeks 2. najmanjeg elementa. Jednom pronađen, drugi najmanji element zamijenjen je elementom u 2. položaju.

Taj se postupak odvija dok ne dođemo do n-1-og elementa niza, koji n-1-i najmanji element stavlja na n-1-i položaj. Posljednji element automatski pada na mjesto, u n-1-oj iteraciji, sortirajući tako niz.

Pronašli smo najveći element umjesto najmanjeg elementa za sortiranje niza u opadajućem redoslijedu.

Pogledajmo primjer nesortiranog niza i razvrstajmo ga uzlazno kako bismo vizualno razumjeli algoritam.

2.1. Primjer

Razmotrite sljedeći nerazvrstani niz:

int [] arr = {5, 4, 1, 6, 2}

Ponavljanje 1

Uzimajući u obzir gore navedeni rad algoritma, započinjemo s elementom na 1. položaju - 5 - i pretražujemo sve sljedeće elemente kako bismo pronašli najmanji element - 1. Zatim zamijenimo najmanji element s elementom na 1. položaju.

Izmijenjeni niz nows izgleda ovako:

{ 1 , 4 , 5 , 6 , 2 }

Ukupno izvršenih usporedbi: 4

Ponavljanje 2

U drugoj iteraciji prelazimo na 2. element - 4 - i pretražujemo sljedeće elemente kako bismo pronašli drugi najmanji element - 2. Zatim zamijenimo drugi najmanji element s elementom na 2. položaju.

Izmijenjeni niz sada izgleda ovako:

{ 1 , 2 , 5 , 6 , 4 }

Ukupno izvršenih usporedbi: 3

Nastavljajući slično, imamo sljedeće ponavljanja:

Ponavljanje 3

{ 1 , 2 , 4 , 6 , 5 }

Ukupno izvršenih usporedbi: 2

Ponavljanje 4

{ 1 , 2 , 4 , 5 , 6 }

Ukupno izvršenih usporedbi: 1

3.Provedba

Primijenimo Sortiranje odabira pomoću nekoliko za petlje:

javna statička void sortAscending (final int [] arr) {for (int i = 0; i <arr.length - 1; i ++) {int minElementIndex = i; za (int j = i + 1; j arr [j]) {minElementIndex = j; }} if (minElementIndex! = i) {int temp = arr [i]; arr [i] = arr [minElementIndex]; arr [minElementIndex] = temp; }}}

Naravno, da bismo to preokrenuli, mogli bismo napraviti nešto sasvim slično:

javna statička praznina sortDescending (final int [] arr) {for (int i = 0; i <arr.length - 1; i ++) {int maxElementIndex = i; for (int j = i + 1; j <arr.length; j ++) {if (arr [maxElementIndex] <arr [j]) {maxElementIndex = j; }} if (maxElementIndex! = i) {int temp = arr [i]; arr [i] = arr [maxElementIndex]; arr [maxElementIndex] = temp; }}}

I s malo više masti za laktove, mogli bismo ih kombinirati pomoću Usporedniks.

4. Pregled izvedbe

4.1. Vrijeme

U primjeru koji smo vidjeli ranije, za odabir najmanjeg elementa potrebno je ukupno (n-1) usporedbe nakon čega je zamijenjena na 1. poziciju. Slično tome, odabir sljedećeg najmanjeg potrebnog elementa (n-2) usporedbe nakon kojih slijedi zamjena na 2. mjestu itd.

Dakle, počevši od indeksa 0, izvodimo n-1, n-2, n-3, n-4…. 1 usporedbe. Posljednji element automatski dolazi na mjesto zbog prethodnih ponavljanja i zamjena.

Matematički, zbroj prvog n-1 prirodni brojevi reći će nam koliko usporedbi trebamo da bismo sortirali niz veličina n pomoću Sortiranja odabira.

Formula za zbroj n prirodni brojevi je n (n + 1) / 2.

U našem slučaju trebamo zbroj prvih n-1 prirodni brojevi. Stoga zamjenjujemo n s n-1 u gornjoj formuli dobiti:

(n-1) (n-1 + 1) / 2 = (n-1) n / 2 = (n ^ 2-n) / 2

Kao n ^ 2 izraženo raste kao n raste, smatramo višom snagom n kao mjerilo performansi, čineći ovaj algoritam a vremenska složenost O (n ^ 2).

4.2. Prostor

Što se tiče složenosti pomoćnog prostora, Sortiranje odabira zahtijeva jednu dodatnu varijablu koja privremeno drži vrijednost za zamjenu. Stoga, Sortiranje odabira složenost prostora je O (1).

5. Zaključak

Sortiranje odabira vrlo je jednostavan algoritam sortiranja za razumijevanje i primjenu. Nažalost, Njegova kvadratna vremenska složenost čini je skupom tehnikom sortiranja. Također, budući da algoritam mora skenirati svaki element, složenost najboljeg slučaja, prosječnog slučaja i najgoreg slučaja je ista.

Druge tehnike sortiranja poput Insertion Sort i Shell Sort također imaju kvadratnu vremensku složenost u najgorem slučaju, ali imaju bolju izvedbu u najboljim i prosječnim slučajevima.

Pogledajte cjeloviti kod za Sortiranje odabira na GitHubu.