Výber Zoradiť v jazyku Java

1. Úvod

V tomto výučbe to urobíme naučiť Selection Sort, pozrite si jeho implementáciu v prostredí Java a analyzujte jeho výkon.

2. Prehľad algoritmov

Výber Zoradiť začína prvkom na 1. pozícii netriedené pole a prehľadá ďalšie prvky do nájsť najmenší prvok. Po nájdení sa najmenší prvok zamení s prvkom na 1. pozícii.

Algoritmus potom prejde k prvku na 2. pozícii a prehľadá nasledujúce prvky, aby našiel index druhého najmenšieho prvku. Po nájdení sa druhý najmenší prvok zamení s prvkom na 2. pozícii.

Tento proces pokračuje, kým sa nedostaneme k n-1. Prvku poľa, čím sa n-1. Najmenší prvok dostane do n-1. Polohy. Posledný prvok automaticky padne na miesto v n-tej iterácii, čím zoradí pole.

Nájdeme najväčší prvok namiesto najmenšieho na zoradenie poľa v zostupnom poradí.

Pozrime sa na príklad netriedeného poľa a zoraďme ho vzostupne, aby sme algoritmu vizuálne porozumeli.

2.1. Príklad

Zvážte nasledujúce netriedené pole:

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

Iterácia 1

Vzhľadom na vyššie uvedené fungovanie algoritmu začneme s prvkom na 1. pozícii - 5 - a skenujeme všetky nasledujúce prvky, aby sme našli najmenší prvok - 1. Potom zameníme najmenší prvok s prvkom na 1. pozícii.

Upravené pole teraz vyzerá takto:

{ 1 , 4 , 5 , 6 , 2 }

Celkové vykonané porovnania: 4

Iterácia 2

V druhej iterácii sa presunieme k 2. prvku - 4 - a skenovaním nasledujúcich prvkov nájdeme druhý najmenší prvok - 2. Potom zameníme druhý najmenší prvok s prvkom na 2. pozícii.

Upravené pole teraz vyzerá takto:

{ 1 , 2 , 5 , 6 , 4 }

Celkové vykonané porovnania: 3

Podobne pokračujeme, máme nasledujúce iterácie:

Iterácia 3

{ 1 , 2 , 4 , 6 , 5 }

Celkové vykonané porovnania: 2

Iterácia 4

{ 1 , 2 , 4 , 5 , 6 }

Celkové vykonané porovnania: 1

3.Implementácia

Poďme implementovať Selection Sort pomocou niekoľkých pre slučky:

public static void sortAscending (final int [] arr) {for (int i = 0; i <arr.length - 1; i ++) {int minElementIndex = i; pre (int j = i + 1; j arr [j]) {minElementIndex = j; }} if (minElementIndex! = i) {int temp = arr [i]; arr [i] = arr [minElementIndex]; arr [minElementIndex] = teplota; }}}

Samozrejme, aby sme to zvrátili, mohli by sme urobiť niečo celkom podobné:

public static void 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] = teplota; }}}

A s trochou väčšieho množstva mazu na lakte by sme ich mohli kombinovať pomocou Komparátors.

4. Prehľad výkonu

4.1. Čas

V príklade, ktorý sme videli skôr, výber najmenšieho prvku vyžadoval celkom (n-1) porovnania nasledovalo jej prehodenie do 1. polohy. Podobne výber nasledujúceho najmenšieho prvku požadovaný súčet (n-2) porovnania, po ktorých nasleduje výmena na 2. pozícii atď.

Počnúc indexom 0 teda vystupujeme n-1, n-2, n-3, n-4…. 1 porovnania. Posledný prvok automaticky zapadne na miesto kvôli predchádzajúcim iteráciám a swapom.

Matematicky súčet prvého n-1 prirodzené čísla nám povie, koľko porovnaní potrebujeme, aby sme zoradili veľkosť poľa n pomocou Selection Sort.

Vzorec pre súčet n prirodzené čísla sú n (n + 1) / 2.

V našom prípade potrebujeme súčet prvých n-1 prirodzené čísla. Preto nahradzujeme n s n-1 vo vyššie uvedenom vzorci získate:

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

Ako n ^ 2 rastie prominentne ako n rastie, uvažujeme s vyššou silou n ako výkonový štandard, vďaka čomu bude mať tento algoritmus a časová zložitosť O (n ^ 2).

4.2. Vesmír

Z hľadiska zložitosti pomocného priestoru vyžaduje Selection Sort jednu ďalšiu premennú na dočasné zadržanie hodnoty pre zámenu. Preto je výber triedenia zložitosť priestoru je O (1).

5. Záver

Selection Sort je veľmi jednoduchý triediaci algoritmus na pochopenie a implementáciu. Bohužiaľ kvadratická časová zložitosť z neho robí nákladnú techniku ​​triedenia. Pretože algoritmus musí prehľadávať každý prvok, najlepší prípad, priemerný prípad a najhoršia časová zložitosť sú rovnaké.

Ostatné techniky triedenia ako Insertion Sort a Shell Sort majú tiež kvadratickú najhoršiu časovú zložitosť, ale v lepších a priemerných prípadoch fungujú lepšie.

Vyskúšajte kompletný kód Selection Seřadit podľa na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found