Sortare selecție | |
---|---|
| |
scop | Algoritm de sortare |
Structură de date | matrice |
cel mai rău moment | O( n 2 ) |
Cel mai bun timp | O( n 2 ) |
Timp mediu | O( n 2 ) |
Costul memoriei | O(1) |
Fișiere media la Wikimedia Commons |
Sortarea selecției este un algoritm de sortare . Poate fi fie stabil, fie instabil. Pe o matrice de n elemente, are un timp de rulare în cel mai rău caz, mediu și cel mai bun caz de Θ ( n 2 ), presupunând că comparațiile sunt făcute în timp constant.
Etapele algoritmului:
Un exemplu de implementare instabilă :
template < typename type_arr > void selectie_sort ( tip_arr * arr , dimensiune int ) { pentru ( int i = 0 ; i < dimensiune - 1 ; i ++ ) { int min_index = i ; pentru ( int j = i + 1 ; j < dimensiune ; j ++ ) { dacă ( arr [ j ] < arr [ min_index ]) { min_index = j ; } } dacă ( min_index != i ) { swap ( arr [ i ], arr [ min_index ]); } } } public static IList < T > Selecție < T >( IList < T > listă ) unde T : IComparable < T > { pentru ( int i = 0 ; i < listă . Număr - 1 ; ++ i ) { int min = i ; pentru ( int j = i + 1 ; j < listă . Număr ; ++ j ) { if ( lista [ j ]. CompareTo ( lista [ min ]) < 0 ) { min = j ; } } vardummy = lista [ i ] ; list [ i ] = list [ min ]; list [ min ] = dummy ; } lista de returnare ; }PL/SQL
tip sort_choice_list este tabel cu index întreg de binary_integer ; -------------------------------------------------- -- funcția SORT_CHOICE returnează sort_choice_list ESTE list sort_choise_list ; l_min pls_integer ; l_dummy pls_integer ; ÎNCEPE pentru n în 1 .. 100 bucle listă ( n ): = dbms_random . aleatoriu ; --inițializarea matricei cu numere aleatorii buclă de capăt ; pentru eu in lista . primul .. lista . ultima buclă l_min : = i ; pentru j în ( i + 1 ).. listă . ultima buclă daca ( lista ( j ) < lista ( l_min )) atunci l_min : = j ; termina daca ; buclă de capăt ; l_dummy : = lista ( i ); list ( i ): = list ( l_min ); listă ( l_min ) : = l_dummy ; buclă de capăt ; lista de returnare ; final SORT_CHOICE ; public static < T se extinde Comparabil <? super T >> void sort ( T [] matrice ) { pentru ( int i = 0 ; i < matrice . lungime - 1 ; ++ i ) { int minPos = i ; pentru ( int j = i + 1 ; j < matrice . lungime ; ++ j ) { if ( matrice [ j ] . compareTo ( matrice [ minPos ] ) < 0 ) { minPos = j ; } } T saveValue = matrice [ minPos ] ; matrice [ minPos ] = matrice [ i ] ; matrice [ i ] = saveValue ; } } def selectie_sort ( matrice ) pentru min în 0 .. matrice . numără - 2 minim = min pentru j în ( min + 1 ) .. matrice . numără - 1 if matrice [ j ] < matrice [ minim ] cel puțin = j Sfârşit Sfârşit temp = matrice [ min ] matrice [ min ] = matrice [ minim ] matrice [ minim ] = temp Sfârşit Sfârşit func selectionSort < Element >( _ array : inout Array < Element >) unde Element : Comparabil { pentru min în 0. .< matrice . numără - 1 { pentru j în min ..< matrice . numără { if matrice [ j ] < matrice [ min ] { let temp = matrice [ min ] matrice [ min ] = matrice [ j ] matrice [ j ] = temp } } } } ÎNCEPE var a := ArrRandom ; a . Println ; pentru var i := 0 la a . High do Schimbați ( a [ i ] , a [ i + a [ i : ] . IndexMin ]) ; a . Println ; Sfârşit def select_sort ( A ): pentru i în interval ( len ( A ) - 1 ): pentru k în interval ( i + 1 , len ( A )): dacă A [ k ] < A [ i ]: A [ k ], A [ i ] = A [ i ], A [ k ] func selectieSort ( nums [] int ) { n := len ( nums ) pentru i := 0 ; i < n ; i ++ { min := i pentru j := i + 1 ; j < n ; j ++ { dacă nums [ j ] < nums [ min ] { min = j } } nums [ i ], nums [ min ] = nums [ min ], nums [ i ] } }Să arătăm de ce această implementare este instabilă.
Luați în considerare următoarea matrice de elemente, fiecare cu două câmpuri. Sortarea se face pe primul câmp.
Matrice înainte de sortare:
{ (2, a), (2, b), (1, a) }
Deja după prima iterație a buclei exterioare, vom avea o secvență sortată:
{ (1, a), (2, b), (2, a) }
Acum rețineți că poziția relativă a elementelor (2, a) și (2, b) sa schimbat. Astfel, implementarea considerată este instabilă.
Deoarece se face un singur schimb după fiecare trecere prin bucla interioară, numărul total de schimburi este N-1, care este de N/2 ori mai mic decât în sortarea cu bule .
Numărul de treceri prin bucla interioară este N-1 chiar dacă sortați o matrice sortată parțial sau complet.
Cel mai rău caz:
numărul de comparații din corpul buclei este (N-1)*N/2.
Numărul de comparații în anteturile buclei (N-1)*N/2.
Numărul de comparații înainte de operațiunea de schimb N-1.
Numărul total de comparații este N 2 −1.
Numărul de schimburi N-1.
Cel mai bun caz:
Timpul de sortare a 10.000 de numere întregi scurte pe același sistem hardware și software prin sortare de selecție a fost ≈40 sec, iar sortarea cu bule chiar mai îmbunătățită a fost ≈30 sec.
Heapsort îmbunătățește foarte mult algoritmul de bază prin utilizarea unei structuri de date heap pentru a accelera găsirea și eliminarea elementului minim.
Există, de asemenea, o variantă bidirecțională de sortare a selecției, în care atât valorile minime, cât și cele maxime sunt găsite și stabilite la fiecare trecere.
Algoritmi de sortare | |
---|---|
Teorie | Complexitate O notație Relația de comandă Sortați tipuri durabil Intern Extern |
schimb valutar | |
Alegere | |
inserții | |
fuziune | |
Fara comparatii | |
hibrid | |
Alte | |
nepractic |