Šioje pamokoje sužinosite, kaip veikia atrankos rūšiavimas. Taip pat rasite veikiančių pasirinkimo rūšiavimo pavyzdžių C, C ++, Java ir Python.
Pasirinkimo rūšiavimas yra algoritmas, kuris pasirenka mažiausią elementą iš nerūšiuoto sąrašo kiekvienoje iteracijoje ir padeda tą elementą nerūšiuoto sąrašo pradžioje.
Kaip veikia atrankos rūšiavimas?
- Pirmąjį elementą nustatykite kaip
minimum
.Pasirinkite bent jau pirmąjį elementą
- Palyginkite
minimum
su antruoju elementu. Jei antrasis elementas yra mažesnis neiminimum
, priskirkite antrąjį elementą kaipminimum
.
Palyginkiteminimum
su trečiuoju elementu. Vėlgi, jei trečiasis elementas yra mažesnis, tada priskirkiteminimum
trečiajam elementui kitaip nieko nedarykite. Procesas tęsiasi iki paskutinio elemento.Palyginkite minimumą su likusiais elementais
- Po kiekvieno pakartojimo
minimum
dedamas į nerūšiuoto sąrašo priekį.Pirmąjį pakeiskite minimaliu
- Kiekvienos kartojimo atveju indeksavimas pradedamas nuo pirmo nerūšiuoto elemento. 1–3 žingsniai kartojami tol, kol visi elementai bus išdėstyti teisingose vietose.
Pirmas kartojimas
Antras kartojimas
Trečias kartojimas
Ketvirtas kartojimas
Pasirinkimo rūšiavimo algoritmas
selectionSort (masyvas, dydis) pakartojimas (dydis - 1) kartus nustatykite pirmąjį nerūšiuotą elementą kaip minimumą kiekvienam nerūšiuotam elementui, jei elementas <currentMinimum nustatytas elementas kaip naujas minimalus apsikeitimo minimumas su pirmuoju nerūšiuotu pozicijos pabaigos pasirinkimu
„Python“, „Java“ ir „C / C ++“ pavyzdžiai
„Python Java C C ++“ # Selection sort in Python def selectionSort(array, size): for step in range(size): min_idx = step for i in range(step + 1, size): # to sort in descending order, change> to < in this line # select the minimum element in each loop if array(i) < array(min_idx): min_idx = i # put min at the correct position (array(step), array(min_idx)) = (array(min_idx), array(step)) data = (-2, 45, 0, 11, -9) size = len(data) selectionSort(data, size) print('Sorted Array in Ascending Order:') print(data)
// Selection sort in Java import java.util.Arrays; class SelectionSort ( void selectionSort(int array()) ( int size = array.length; for (int step = 0; step < size - 1; step++) ( int min_idx = step; for (int i = step + 1; i to < in this line. // Select the minimum element in each loop. if (array(i) < array(min_idx)) ( min_idx = i; ) ) // put min at the correct position int temp = array(step); array(step) = array(min_idx); array(min_idx) = temp; ) ) // driver code public static void main(String args()) ( int() data = ( 20, 12, 10, 15, 2 ); SelectionSort ss = new SelectionSort(); ss.selectionSort(data); System.out.println("Sorted Array in Ascending Order: "); System.out.println(Arrays.toString(data)); ) )
// Selection sort in C #include // function to swap the the position of two elements void swap(int *a, int *b) ( int temp = *a; *a = *b; *b = temp; ) void selectionSort(int array(), int size) ( for (int step = 0; step < size - 1; step++) ( int min_idx = step; for (int i = step + 1; i to < in this line. // Select the minimum element in each loop. if (array(i) < array(min_idx)) min_idx = i; ) // put min at the correct position swap(&array(min_idx), &array(step)); ) ) // function to print an array void printArray(int array(), int size) ( for (int i = 0; i < size; ++i) ( printf("%d ", array(i)); ) printf(""); ) // driver code int main() ( int data() = (20, 12, 10, 15, 2); int size = sizeof(data) / sizeof(data(0)); selectionSort(data, size); printf("Sorted array in Acsending Order:"); printArray(data, size); )
// Selection sort in C++ #include using namespace std; // function to swap the the position of two elements void swap(int *a, int *b) ( int temp = *a; *a = *b; *b = temp; ) // function to print an array void printArray(int array(), int size) ( for (int i = 0; i < size; i++) ( cout << array(i) << " "; ) cout << endl; ) void selectionSort(int array(), int size) ( for (int step = 0; step < size - 1; step++) ( int min_idx = step; for (int i = step + 1; i to < in this line. // Select the minimum element in each loop. if (array(i) < array(min_idx)) min_idx = i; ) // put min at the correct position swap(&array(min_idx), &array(step)); ) ) // driver code int main() ( int data() = (20, 12, 10, 15, 2); int size = sizeof(data) / sizeof(data(0)); selectionSort(data, size); cout << "Sorted array in Acsending Order:"; printArray(data, size); )
Sudėtingumas
Ciklas | Palyginimo skaičius |
---|---|
1-oji | (n-1) |
2-oji | (n-2) |
3 d | (n-3) |
… | … |
paskutinis | 1 |
Palyginimų skaičius: (n - 1) + (n - 2) + (n - 3) +… + 1 = n(n - 1) / 2
beveik lygus .n2
Sudėtingumas =O(n2)
Be to, mes galime analizuoti sudėtingumą, tiesiog stebėdami kilpų skaičių. Yra 2 kilpos, taigi sudėtingumas yra .n*n = n2
Laiko sudėtingumas:
- Blogiausio atvejo sudėtingumas: Jei norime rūšiuoti didėjimo tvarka ir masyvas yra mažėjimo tvarka, įvyksta blogiausias atvejis.
O(n2)
- Geriausio atvejo sudėtingumas: jis atsiranda, kai masyvas jau yra rūšiuojamas
O(n2)
- Vidutinis atvejo sudėtingumas: Tai įvyksta, kai masyvo elementai yra susimaišę (nei didėjant, nei mažėjant).
O(n2)
Pasirinkimo rūšiavimo laiko sudėtingumas visais atvejais yra vienodas. Kiekviename žingsnyje turite rasti minimalų elementą ir įdėti jį į reikiamą vietą. Minimalus elementas nėra žinomas, kol nepasiekiama masyvo pabaiga.
Erdvės sudėtingumas:
Erdvė yra sudėtinga, O(1)
nes naudojamas papildomas kintamasis temp
.
Pasirinkimas Rūšiuoti programas
Pasirinkimo rūšiavimas naudojamas, kai:
- nedidelis sąrašas turi būti rūšiuojamas
- apsikeitimo kaina neturi reikšmės
- patikrinti visus elementus yra privaloma
- rašymo į atmintį kaina yra svarbi kaip „flash“ atmintyje (rašymo / apsikeitimo skaičius yra
O(n)
lyginamas su burbulų rūšiavimu)O(n2)