Clasificación de selección

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 22 de febrero de 2019; las comprobaciones requieren 33 ediciones .
Clasificación de selección

objetivo Algoritmo de clasificación
Estructura de datos formación
peor momento O( n 2 )
Mejor tiempo O( n 2 )
Tiempo promedio O( n 2 )
costo de memoria O(1)
 Archivos multimedia en Wikimedia Commons

La clasificación por selección es un algoritmo de clasificación . Puede ser estable o inestable. En una matriz de n elementos, tiene un tiempo de ejecución en el peor de los casos, en el promedio y en el mejor de los casos de Θ ( n 2 ), suponiendo que las comparaciones se realizan en tiempo constante.

Algoritmo sin asignación de memoria adicional

Pasos del algoritmo:

  1. encontrar el número del valor mínimo en la lista actual
  2. intercambiamos este valor con el valor de la primera posición sin ordenar (el intercambio no es necesario si el elemento mínimo ya está en esta posición)
  3. ahora ordenamos la cola de la lista, excluyendo los elementos ya ordenados de la consideración

Un ejemplo de una implementación inestable :

C++

plantilla < nombre de tipo type_arr > void selection_sort ( type_arr * arr , int size ) { para ( int i = 0 ; i < tamaño - 1 ; i ++ ) { int min_index = yo ; para ( int j = i + 1 ; j < tamaño ; j ++ ) { si ( arr [ j ] < arr [ min_index ]) { índice_min = j ; } } si ( min_index ! = i ) { intercambio ( arr [ i ], arr [ min_index ]); } } }

C#

IList estática pública < T > Selección < T > ( IList < T > lista ) donde T : IComparable < T > { for ( int i = 0 ; i < lista . Cuenta - 1 ; ++ i ) { int min = yo ; for ( int j = i + 1 ; j < lista . Cuenta ; ++ j ) { if ( lista [ j ]. CompareTo ( lista [ min ]) < 0 ) { mín = j ; } } vardummy = lista [ i ] ; lista [ i ] = lista [ min ]; lista [ min ] = dummy ; } lista de retorno ; }

PL/SQL

tipo sort_choice_list es una tabla de índice de enteros por binary_integer ; -------------------------------------------------- -- función SORT_CHOICE devuelve sort_choice_list ES lista sort_choise_list ; l_min pls_integer ; l_dummy pls_integer ; empezar para n en 1 .. 100 bucles lista ( n ): = dbms_random . aleatorio ; --inicialización de matriz con números aleatorios bucle final ; para i en la lista . primero .. lista . último bucle l_min : = yo ; para j en ( i + 1 ) .. lista . último bucle si ( lista ( j ) < lista ( l_min )) entonces l_mín : = j ; terminar si ; bucle final ; l_dummy : = lista ( i ); lista ( i ): = lista ( l_min ); lista ( l_min ) : = l_dummy ; bucle final ; lista de retorno ; fin SORT_CHOICE ;

Java

public static < T se extiende Comparable <? súper T >> clasificación vacía ( T [] matriz ) { for ( int i = 0 ; i < arreglo . longitud - 1 ; ++ i ) { int minPos = i ; for ( int j = i + 1 ; j < matriz . longitud ; ++ j ) { if ( matriz [ j ] . compareTo ( matriz [ minPos ] ) < 0 ) { minPos = j ; } } T saveValue = matriz [ minPos ] ; arreglo [ minPos ] = arreglo [ i ] ; matriz [ i ] = saveValue ; } }

rubí

def selección_ordenar ( matriz ) para min en 0 .. matriz . contar - 2 menos = min para j en ( min + 1 ) .. matriz . contar - 1 si matriz [ j ] < matriz [ menos ] menos = j final final temperatura = matriz [ min ] matriz [ min ] = matriz [ menor ] matriz [ menor ] = temporal final final

Rápido

func selectionSort < Elemento >( _ array : inout Array < Elemento >) where Elemento : Comparable { para min en 0. .< matriz . contar - 1 { para j en min ..< matriz . contar { si matriz [ j ] < matriz [ min ] { let temp = matriz [ min ] matriz [ min ] = matriz [ j ] matriz [ j ] = temporal } } } }

PascalABC.NET

empezar var a := ArrRandom ; un . Imprimir ; para var i := 0 a a . alto hacer Intercambiar ( a [ i ] , a [ i + a [ i : ] . IndexMin ]) ; un . Imprimir ; final

Pitón

def seleccionar_ordenar ( A ): para i en rango ( len ( A ) - 1 ): para k en rango ( i + 1 , len ( A )): si A [ k ] < A [ i ]: UNA [ k ], UNA [ yo ] = UNA [ yo ], UNA [ k ]

Vamos

func selecciónOrdenar ( nums [] int ) { n := len ( numeros ) para yo := 0 ; yo < n ; yo ++ { min := yo para j := i + 1 ; j < norte ; j ++ { si números [ j ] < números [ min ] { mín = j } } números [ i ], números [ min ] = números [ min ], números [ i ] } }

Demostremos por qué esta implementación es inestable.
Considere la siguiente matriz de elementos, cada uno con dos campos. La clasificación va en el primer campo.
Matriz antes de ordenar:
{ (2, a), (2, b), (1, a) }
Ya después de la primera iteración del bucle externo, tendremos una secuencia ordenada:
{ (1, a), (2, b), (2, a) }
Ahora observe que la posición relativa de los elementos (2, a) y (2, b) ha cambiado. Por lo tanto, la implementación considerada es inestable.


Dado que solo se realiza un intercambio después de cada paso por el circuito interno, el número total de intercambios es N-1, que es N/2 veces menor que en el tipo de burbuja .
El número de pases a través del bucle interno es N-1 incluso si se clasifica una matriz ordenada parcial o completamente.

Peor caso:
el número de comparaciones en el cuerpo del bucle es (N-1)*N/2.
Número de comparaciones en encabezados de bucle (N-1)*N/2.
Número de comparaciones antes de la operación de cambio N-1.
El número total de comparaciones es N 2 −1.
Número de intercambios N-1.

Mejor caso:


El tiempo de clasificación de 10.000 enteros cortos en el mismo sistema de hardware y software por clasificación por selección fue de ≈40 segundos, y la clasificación de burbuja aún más mejorada fue de ≈30 segundos.

Heapsort mejora en gran medida el algoritmo subyacente mediante el uso de una estructura de datos de montón para acelerar la búsqueda y eliminación del elemento mínimo.

También existe una variante bidireccional de clasificación por selección, en la que tanto los valores mínimos como máximos se encuentran y se establecen en cada pasada.

Literatura

  • Levitin A. V. Capítulo 3. Método de fuerza bruta: Ordenación por selección // Algoritmos. Introducción al desarrollo y análisis - M .: Williams , 2006. - S. 143-144. — 576 pág. — ISBN 978-5-8459-0987-9
  • Roberto Sedgwick. Parte III. Capítulo 6. Métodos de clasificación elementales: 6.2 Clasificación por selección // Algoritmos en C++ = Algoritmos en C++. - M. : "Williams" , 2011. - S. 246-247. - ISBN 978-5-8459-1650-1 .
  • Kormen, T. , Leizerson, C. , Rivest, R. , Stein, K. Algoritmos: construcción y análisis = Introducción a los Algoritmos / Ed. I. V. Krasikova. - 2ª ed. - M. : Williams, 2005. - 1296 p. — ISBN 5-8459-0857-4 .

Véase también

Enlaces