Vodič za algoritam sortiranja na mjestu radi s implementacijom Jave

1. Uvod

U ovom uputstvu objasnit ćemo kako funkcionira algoritam sortiranja na mjestu.

2. Algoritmi na mjestu

Ugrađeni algoritmi su oni kojima nije potrebna pomoćna struktura podataka kako bi transformirali ulazne podatke. U osnovi, to znači da algoritam ne koristi dodatni prostor za manipulaciju ulazom. Praktički nadjačava ulaz i izlaz.

Međutim, u stvarnosti algoritam zapravo može zahtijevati mali i nestalni dodatni prostor za pomoćne varijable. Složenost ovog prostora je u većini slučajeva O (zapisnik n), iako je ponekad dopušteno i nešto manje od linearnog.

3. Pseudokod

Pogledajmo sada pseudokod i usporedimo algoritam na mjestu s onim koji nije na mjestu.

Pretpostavit ćemo da želimo preokrenuti niz od n brojevi.

3.1. Algoritam na mjestu

Ako razmislimo o problemu, vidjet ćemo da imamo izlazni niz i obrnuti niz kao izlaz. Na kraju, zapravo nam ne treba naš izvorni niz, već samo obrnuti.

Zašto onda ne bismo prepisali ulaz umjesto da njegove vrijednosti premjestimo u potpuno novi niz, jer to može izgledati kao najočitija metoda? Napraviti to, trebat će nam samo jedna dodatna varijabla za privremeno spremanje vrijednosti s kojima trenutno radimo:

reversInPlace (niz A [n]) za i od 0 do n / 2 temp = A [i] A [i] = A [n - 1 - i] A [n - 1 - i] = temp

Vrijedno je spomenuti da, bez obzira koliko velik niz bio, dodatni prostor koji nam treba uvijek će biti O (1) u ovom slučaju.

Ilustracija pokazuje da nam treba manje koraka nego u prethodnom slučaju:

3.2. Algoritam izvan mjesta

S druge strane, to također možemo učiniti na prilično jednostavan, očitiji način. Možemo stvoriti novi niz iste veličine, kopirati vrijednosti iz izvornog u odgovarajućem redoslijedu, a zatim izbrisati izvorni niz:

reverseOutOfPlace (niz A [n]) stvori novi niz B [n] za i od 0 do n - 1 B [i] = A [i] izbriši A povratak B

Iako će ovo učiniti ono što smo htjeli, nije dovoljno učinkovito. Imamo Na) potreban dodatni prostorbudući da imamo dva niza za manipulaciju. Osim toga, stvaranje i uklanjanje novog niza obično je spora operacija.

Pogledajmo ilustraciju postupka:

4. Implementacija Jave

Pogledajmo sada kako u Java možemo implementirati ono što smo naučili u prethodnom odjeljku.

Prvo, implementirat ćemo algoritam na mjestu:

javni statički int [] reverseInPlace (int A []) {int n = A.dužina; za (int i = 0; i <n / 2; i ++) {int temp = A [i]; A [i] = A [n - 1 - i]; A [n - 1 - i] = temp; } povratak A; }

Možemo lako testirati da li ovo funkcionira prema očekivanjima:

@Test javna praznina givenArray_whenInPlaceSort_thenReversed () {int [] input = {1, 2, 3, 4, 5, 6, 7}; int [] očekuje se = {7, 6, 5, 4, 3, 2, 1}; assertArrayEquals ("dva polja nisu jednaka", očekuje se, InOutSort.reverseInPlace (ulaz)); }

Drugo, provjerimo implementaciju algoritma koji nije mjesto:

javni statički int [] reverseOutOfPlace (int A []) {int n = A.dužina; int [] B = novo int [n]; za (int i = 0; i <n; i ++) {B [n - i - 1] = A [i]; } povratak B; }

Test je prilično jednostavan:

@Test javna praznina givenArray_whenOutOfPlaceSort_thenReversed () {int [] input = {1, 2, 3, 4, 5, 6, 7}; int [] očekuje se = {7, 6, 5, 4, 3, 2, 1}; assertArrayEquals ("dva polja nisu jednaka", očekuje se, InOutSort.reverseOutOfPlace (ulaz)); }

5. Primjeri

Postoji mnogo algoritama za sortiranje koji koriste pristup na mjestu. Neki od njih su sortiranje umetanjem, mjehurići, sortiranje hrpe, brzo sortiranje i sortiranje ljuske, a možete saznati više o njima i provjeriti njihove Java implementacije.

Također, moramo spomenuti sortu češlja i sortu češlja. Sve ovo ima složenost prostora O (zapisnik n).

Također bi moglo biti korisno naučiti više o teoriji Big-O notacije, kao i provjeriti neke praktične Java primjere o složenosti algoritma.

6. Zaključak

U ovom smo članku opisali takozvane in-place algoritme, ilustrirali kako oni rade pomoću pseudo koda i nekoliko primjera, naveli nekoliko algoritama koji rade na ovom principu i na kraju implementirali osnovne primjere u Javi.

Kao i obično, cijeli se kôd može naći na GitHubu.