Šajā apmācībā jūs uzzināsiet, kā darbojas atlases kārtošana. Jūs atradīsit arī atlases kārtošanas piemērus C, C ++, Java un Python.
Atlases kārtošana ir algoritms, kas izvēlas mazāko elementu no nešķirotā saraksta katrā atkārtojumā un ievieto šo elementu nešķirotā saraksta sākumā.
Kā darbojas atlases kārtošana?
- Pirmo elementu iestatiet kā
minimum
.Atlasiet pirmo elementu kā minimumu
- Salīdziniet
minimum
ar otro elementu. Ja otrais elements ir mazāks parminimum
, piešķiriet otro elementu kāminimum
.
Salīdzinietminimum
ar trešo elementu. Atkal, ja trešais elements ir mazāks, tad piešķirietminimum
trešajam elementam citādi neko nedarīt. Process turpinās līdz pēdējam elementam.Salīdziniet minimumu ar atlikušajiem elementiem
- Pēc katras atkārtošanas
minimum
tiek ievietots nešķirotā saraksta priekšpusē.Apmainiet pirmo ar minimālo
- Katrā atkārtojumā indeksēšana sākas no pirmā nešķirotā elementa. 1. līdz 3. darbību atkārto, līdz visi elementi ir novietoti pareizajā pozīcijā.
Pirmais atkārtojums
Otrais atkārtojums
Trešais atkārtojums
Ceturtais atkārtojums
Atlase Kārtot algoritmu
sortSort (masīvs, izmērs) atkārtot (izmērs - 1) reizes iestatiet pirmo nešķiroto elementu kā minimumu katram no nešķirotajiem elementiem, ja elements <currentMinimum iestatītais elements kā jauns minimālais mijmaiņas minimums ar pirmo nešķiroto pozīcijas beigu atlasi
Python, Java un C / C ++ piemēri
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); )
Sarežģītība
Cikls | Salīdzināšanas numurs |
---|---|
1 | (n-1) |
2 | (n-2) |
3 | (n-3) |
… | … |
Pēdējais | 1 |
Salīdzinājumu skaits: (n - 1) + (n - 2) + (n - 3) +… + 1 = n(n - 1) / 2
gandrīz vienāds ar .n2
Sarežģītība =O(n2)
Tāpat mēs varam analizēt sarežģītību, vienkārši novērojot cilpu skaitu. Ir 2 cilpas, tāpēc sarežģītība ir .n*n = n2
Laika sarežģītība:
- Sliktākā gadījuma sarežģītība: ja mēs vēlamies kārtot augošā secībā un masīvs ir dilstošā secībā, notiek vissliktākais gadījums.
O(n2)
- Labākā gadījuma sarežģītība: tas notiek, ja masīvs jau ir sakārtots
O(n2)
- Vidējā gadījuma sarežģītība: tā notiek, ja masīva elementi ir sajaukti secībā (ne augšupejoši, ne dilstoši).
O(n2)
Atlases kārtošanas laika sarežģītība visos gadījumos ir vienāda. Katrā solī jums jāatrod minimālais elements un jānovieto tas pareizajā vietā. Minimālais elements nav zināms, kamēr nav sasniegta masīva beigas.
Kosmosa sarežģītība:
Kosmoss ir sarežģīts O(1)
tāpēc, ka temp
tiek izmantots papildu mainīgais .
Atlasiet Lietojumu kārtošana
Atlases kārtošana tiek izmantota, ja:
- ir jāšķiro neliels saraksts
- maiņas izmaksām nav nozīmes
- visu elementu pārbaude ir obligāta
- rakstīšanas atmiņā izmaksas ir svarīgas, piemēram, zibatmiņā (rakstīšanas / mijmaiņas darījumu skaits ir
O(n)
salīdzināms ar burbuļu kārtošanu)O(n2)