I den här handledningen lär du dig hur urvalsortering fungerar. Du hittar också arbetsexempel på urvalsortering i C, C ++, Java och Python.
Urvalsortering är en algoritm som väljer det minsta elementet från en osorterad lista i varje iteration och placerar det elementet i början av den osorterade listan.
Hur fungerar urvalssortering?
- Ställ in det första elementet som
minimum
.Välj det första elementet som minimum
- Jämför
minimum
med det andra elementet. Om det andra elementet är mindre änminimum
, tilldela det andra elementet somminimum
.
Jämförminimum
med det tredje elementet. Återigen, om det tredje elementet är mindre, så tilldelaminimum
det tredje elementet annars gör ingenting. Processen pågår tills det sista elementet.Jämför minimum med de återstående elementen
- Efter varje iteration
minimum
placeras det framför den osorterade listan.Byt den första med ett minimum
- För varje iteration börjar indexering från det första osorterade elementet. Steg 1 till 3 upprepas tills alla element är placerade i rätt position.
Den första iteration
Den andra iteration
Den tredje iteration
Den fjärde iteration
Urvals sorteringsalgoritm
selectionSort (array, size) repeat (storlek - 1) gånger ställer in det första osorterade elementet som minimum för vart och ett av de osorterade elementen om elementet <currentMinimum set element som nytt minimum swap minimum med första osorterade positionens slutval
Python, Java och C / C ++ exempel
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); )
Komplexitet
Cykel | Antal jämförelser |
---|---|
1: a | (n-1) |
2: a | (n-2) |
3: e | (n-3) |
… | … |
sista | 1 |
Antal jämförelser: (n - 1) + (n - 2) + (n - 3) +… + 1 = n(n - 1) / 2
nästan lika med .n2
Komplexitet =O(n2)
Vi kan också analysera komplexiteten genom att helt enkelt observera antalet slingor. Det finns två slingor så komplexiteten är .n*n = n2
Tidskomplexitet:
- Värstfallskomplexitet: Om vi vill sortera i stigande ordning och matrisen är i fallande ordning inträffar det värsta fallet.
O(n2)
- Bästa fallskomplexitet: Det inträffar när arrayen redan är sorterad
O(n2)
- Genomsnittlig fallkomplexitet: Det inträffar när elementen i matrisen är i rörlig ordning (varken stigande eller fallande).
O(n2)
Tidskomplexiteten för urvalssorten är i alla fall densamma. I varje steg måste du hitta minimielementet och placera det på rätt plats. Minimielementet är inte känt förrän slutet av matrisen inte nås.
Rymdkomplexitet:
Rymdkomplexitet O(1)
beror på att en extra variabel temp
används.
Val Sortera applikationer
Urvalssorteringen används när:
- en liten lista ska sorteras
- kostnaden för att byta spelar ingen roll
- kontroll av alla element är obligatorisk
- kostnaden för att skriva till ett minne spelar roll som i flashminnet (antalet skrivningar / byten är
O(n)
jämfört med bubblansortering)O(n2)