I denne veiledningen lærer du hvordan utvalgssortering fungerer. Du finner også arbeidseksempler på utvalgssortering i C, C ++, Java og Python.
Valgsortering er en algoritme som velger det minste elementet fra en usortert liste i hver iterasjon og plasserer elementet i begynnelsen av den usorterte listen.
Hvordan fungerer valgssortering?
- Sett det første elementet som
minimum
.Velg det første elementet som minimum
- Sammenlign
minimum
med det andre elementet. Hvis det andre elementet er mindre ennminimum
, tilordner du det andre elementet somminimum
.
Sammenlignminimum
med det tredje elementet. Igjen, hvis det tredje elementet er mindre, så tilordneminimum
det tredje elementet ellers gjør ingenting. Prosessen fortsetter til det siste elementet.Sammenlign minimum med gjenværende elementer
- Etter hver iterasjon,
minimum
er plassert foran den usorterte listen.Bytt den første med minimum
- For hver iterasjon starter indeksering fra det første usorterte elementet. Trinn 1 til 3 gjentas til alle elementene er plassert i riktig posisjon.
Den første iterasjonen
Den andre iterasjonen
Den tredje iterasjonen
Den fjerde iterasjonen
Utvalg Sorteringsalgoritme
selectionSort (array, size) repeat (size - 1) times set the first usorted element as the minimum for each of the usorted elements if element <currentMinimum set element as new minimum swap minimum with first usorted position end selectionSort
Python, Java og C / C ++ eksempler
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); )
Kompleksitet
Syklus | Antall sammenligninger |
---|---|
Første | (n-1) |
2. plass | (n-2) |
3. | (n-3) |
… | … |
siste | 1 |
Antall sammenligninger: (n - 1) + (n - 2) + (n - 3) +… + 1 = n(n - 1) / 2
nesten lik .n2
Kompleksitet =O(n2)
Vi kan også analysere kompleksiteten ved å bare observere antall løkker. Det er to sløyfer så kompleksiteten er .n*n = n2
Tidskompleksiteter:
- Verste sakskompleksitet: Hvis vi vil sortere i stigende rekkefølge og matrisen er i synkende rekkefølge, oppstår det verste tilfellet.
O(n2)
- Best case-kompleksitet: Det oppstår når matrisen allerede er sortert
O(n2)
- Gjennomsnittlig sakskompleksitet: Det oppstår når elementene i matrisen er i rotet rekkefølge (verken stigende eller synkende).
O(n2)
Tids kompleksiteten til utvalget er i alle tilfeller den samme. Ved hvert trinn må du finne minimumselementet og sette det på rett sted. Minimumselementet er ikke kjent før slutten av matrisen ikke er nådd.
Romkompleksitet:
Romkompleksitet er O(1)
fordi det brukes en ekstra variabel temp
.
Valg Sorter applikasjoner
Valgsorteringen brukes når:
- en liten liste skal sorteres
- kostnadene ved å bytte spiller ingen rolle
- kontroll av alle elementene er obligatorisk
- kostnadene ved å skrive til et minne betyr noe som i flashminnet (antall skriver / bytter er
O(n)
sammenlignet med en slags boble)O(n2)