Introducción al Método del Ordenamiento por Selección
C AP ÍTU LO 1
Introducción al Método del Ordenamiento por Selección
comparaciones llevadas a cabo, y el número de asignaciones. Respecto al consumo de memoria, son considerados más eficientes aquellos algoritmos que utilicen estructuras de datos adecuadas con el fin de minimizar el espacio de almacenamiento utilizado.
Introducción
El método del Ordenamiento por Selección (Selection sort) es, valga la redundancia, un algoritmo de ordenamient o que modifica la ubicación de los componentes de un arreglo o lista para satisfacer algún criterio de ordenamiento preestablecido, siendo los más comunes el orden numérico y lexicográfico. Cuando tenemos frente a nosotros varios algoritmos que cumplen una misma tarea se estudia la eficiencia de los mismos con el fin de determinar cual de ellos es el óptimo en base a la cantidad de memoria ocupada para el almacenamiento y el tiempo de ejecución, no siendo relevante para este estudio el lenguaje utilizado ni las características de la computadora.
Si bien este método de ordenamiento no es conocido por ser el más estable o con menor orden de complejidad, es fácil de comprender. Por este motivo es que el Ordenamiento por Selección se utiliza con mucha frecuencia en el ámbito educativo para insertar a la persona en la confección y entendimiento de algoritmos.
Esta claro que hoy en día la velocidad de procesamiento de una computadora es tan elevado que muchos de los problemas que debe afrontar no implican para la misma un importante consumo de tiempo o espacio de almacenamiento. De igual forma, se siguen presentando situaciones en las que el volumen de la trata de datos es tan ele vado que la optimización de un algoritmo o la selección del óptimo cobran importancia. A grandes rasgos, analizar la eficiencia de un algoritmo implica tener en cuenta la cantidad de variables utilizadas, las 2
C AP ÍTU LO 2
Ordenamiento por Selección
El algoritmo recorre el arreglo a partir de la segunda posición hasta el final con el fin de encontrar el elemento más pequeño. Una vez encontrado, este elemento se copia a la primera posición analizada en la pasada del algoritmo, siendo en este caso la segunda posición del arreglo.
Funcionamiento
El método del Ordenamiento por Selección continua realizando la misma tarea en cada pasada hasta llegar al final del arreglo, omitiendo en cada vuelta la posición más chica de la ronda anterior (en la tercera vuelta se omite el análisis de la segunda posición, en la cuarta vuelta se omite el análisis de la tercera posición, y sucesivamente). El método del Ordenamiento por Selección recorre hasta el final el arreglo destinado para su ordenamiento con el fin de encontrar el elemento de valor más bajo. Una vez que se lo ubica, el mismo se copia a la primera posición del arreglo. El viejo contenido de la primera posición del arreglo se debe copiar a la antigua posición del elemento más pequeño encontrado en el paso anterior. Para poder llevar a cabo esta tarea el algoritmo guarda en una variable auxiliar el contenido de la primera posición del arreglo antes de copiar en dicho lugar el elemento más pequeño encontrado.
Una vez finalizado el algoritmo y procesado todo el arreglo, el mismo se encontrará ordenado. En este caso concreto se plantea un ordenamiento ascendente, aunque es posible un ordenamiendo descendente si se modifica el código para que en cada vuelta se busque el elemento más grande en lugar del más pequeño.
En otras palabras, se intercambia el valor de la primera posición del arreglo con el valor de la ubicación del elemento más pequeño encontrado. Cuando se produce la segunda pasada del algoritmo se repite el proceso anterior pero esta vez sin tener en cuenta la primera posición del arreglo. 4
El algoritmo correspondiente al método del Ordenamiento por Selección trabaja con dos for (para) anidados, donde el primero se ejecuta n-1 veces y el segundo n-1 veces para la primera pasada, siendo n la cantidad de componentes del arreglo destinado a su ordenamiento. Cuando se produce la segunda vuelta del algoritmo, el primer for (para) se ejecuta n-2 veces, al igual que el segundo. Siguiendo esta lógica, en la pasada número X ambos for (para) se ejecutarán n-X veces, lo cual queda resumido en la siguiente formula.
queño encontrado se debe guardar en la segunda variable auxiliar, aux, el contenido de esta posición para luego copiar este valor a la posición inicial en la que se encontraba el elemento más pequeño encontrado. Es posible resumir todo el intercambio de componente que lleva a cabo el algoritmo correspondiente al método del Ordenamiento por Selección en tres pasos: 1. Se copia en la variable aux el contenido de la primera posición del arreglo. 2. En la primera posición del arreglo se copia el elemento más chico encontrado.
(n-1) + (n-2) + (n-3) + ... + n - (n-1) Aplicando la propiedad de suma de series aritméticas (la sumatoria de una serie es igual a la suma del primer elemento más el último multiplicado por la mitad de la cantidad de elementos de la serie) obtenemos que el orden de complejidad en el cual se encuentra este algoritmo es N^2.
3. En la posición inicial del elemento más chico encontrado señalada por la variable min se copia el contenido almacenado en la variable aux.
((N-1)+1)*(N-1)/2=N*(N-1)/2=(N^2-N)*1/2 => O(N^2) Para que el algoritmo del método del Ordenamiento por Selección pueda cumplir su objetivo hace uso de dos variables auxiliares. La primera, min, se utiliza para guardar la ubicación del elemento más pequeño encontrado para luego realizar el intercambio de componente con la primera posición del arreglo (en el caso de la primera pasada). Antes de sobreescribir la primera posición del arreglo con el valor del elemento más pe5
C AP ÍTU LO 3
Algoritmos
Algoritmo en pseudocódigo
Algoritmo Selección Comienzo Constante n=5 Entero Arreglo[n], i, j, min, aux Para i desde 0 hasta n-2 min = i Para j desde i+1 hasta n-1 Si (Arreglo[j] < Arreglo[min]) Entonces min = j FinSi FinPara aux = Arreglo[i] Arreglo[i] = Arreglo[min] Arreglo[min] = Aux FinPara Fin 7
min = j; }
Algoritmo en C
} aux = arreglo[i]; arreglo[i] = arreglo[min]; arreglo[min] = aux; } printf("\n"); printf("Este es su arreglo ordenado: "); for (i=0; i<=n-1; i++) { printf("%d", arreglo[i]);
#include #include #include #include #define n 5
printf(" - "); } printf("\n"); system ("pause"); }
main() { int arreglo[n], i, j, min, aux; for (i=0; i<=n-1; i++) { printf("Ingrese elemento del arreglo: "); scanf("%d", &arreglo[i]); getchar(); } for (i=0; i<=n-2; i++) { min = i; for (j=i+1; j<=n-1; j++) { if (arreglo[j] < arreglo[min]) {
8
C AP ÍTU LO 4
Seguimientos
Seguimiento para un arreglo ordenado en forma ascendente
se encontraba inicialmente puesto que se trata del segundo elemento más pequeño del arreglo.
31 3.
4.
1.
53
78
36
53
78
95
36
53
78
95
36
53
78
95
95
En la primera pasada del algoritmo, el número 31 (el más pequeño encontrado en todas las componente que conforman el arreglo) se vuelve a copiar en la misma posición en el que se encuentra (la primera posición del arreglo).
31 2.
36
78
El siguiente paso consiste en ubicar el número 78 en la misma posición en la cual se encuentra (arreglo[3]).
31 31
53
Repitiendo las operaciones anteriores, el número 53 (el elemento más pequeño del resto del arreglo) se vuelve a ubicar en la tercera posición (arreglo[2]), siendo esta posición el lugar donde ya se encuentra ubicado.
31 Tomando a modo de ejemplo el siguiente arreglo cuyas componentes se encuentran ordenadas de forma ascendente, se procederá a ordenar el mismo de forma ascendente utilizando el método del Ordenamiento por Selección.
36
La cuarta pasada corresponde a la última de las vueltas del algoritmo sobre el arreglo, el cual en este punto ha sido procesado por completo y se encuentra ordenado de forma ascendente.
95
El número 36 es ubicado en la segunda posición del arreglo (arreglo[1]), es decir en la misma posición donde
10
elemento más pequeño de las restantes componente se encuentra en la penultima posición (arreglo[3]). Se realiza el intercambio entre esta posición y la segunda posición del arreglo (arreglo[1]).
Seguimiento para un arreglo invertido respecto al orden deseado
31 3.
Tomando a modo de ejemplo el siguiente arreglo cuyas componentes se encuentran ordenadas de forma descendente, se procederá a ordenar el mismo de forma ascendente aplicando el método del Ordenamiento por Selección.
95 1.
53
36
31
En la primera pasada del algoritmo se almacena la posición del elemento más pequeño encontrado (arreglo[4]) que contiene el número 31. A este valor se lo intercambia con el valor contenido en la primera posición del arreglo.
31 2.
78
78
53
36
95
53
78
95
El algoritmo determina la posición del tercer elemento más pequeño del arreglo y lo intercambia con el ubicado en la tercera posición. En este caso las posiciones coinciden y el número 53 se copia en la misma ubicación que ocupa.
31 4.
36
36
53
78
95
Por más que el algoritmo ya se encuentre ordenado, la ejecución continua y el número 78 se copia en la misma posición en la que se encuentra (arreglo[3]).
31
36
53
78
95
La cuarta pasada corresponde a la última de las vueltas del algoritmo sobre el arreglo, el cual en este punto ha sido procesado por completo y se encuentra ordenado de forma ascendente.
Se vuelve a recorrer la totalidad del arreglo, omitiendo en esta pasada la primera posición, y se determina que el 11
Seguimiento para un arreglo ordenado en forma aleatoria
trata del segundo elemento más pequeño de todo el arreglo.
3 3.
16
26
98
90
125
429
Se repite lo ocurrido en el paso anterior, puesto que el 16 se debe copiar en la misma posición en la cual se encuentra (arreglo[2]).
3 Tomando a modo de ejemplo el siguiente arreglo cuyas componentes se encuentran ordenadas de forma aleatoria, se procederá a ordenar el mismo de forma ascendente utilizando el método del Ordenamiento por Selección.
14
4.
14
16
26
98
90
125
429
En la cuarta pasada del algoritmo, se detecta al número 26 como el más pequeño de los valores de las componentes restantes, y el mismo se copia a la cuarta posición (arreglo[3]), siendo esta la misma posición en la que se encontraba originalmente.
26
14
16
3
98
90
125
429 3
1.
En la primera pasada del algoritmo, se analizan todas las componentes y se identifica el ubicado en la cuarta posición (arreglo[3]) como el de valor más pequeño. El mismo se intercambia con el valor de la primera componente.
3 2.
14
16
26
98
90
125
5.
429
El número 14 se copia en la misma posición en la que se encuentra originalmente (arreglo[1]) puesto que se
16
26
98
90
125
429
De las siguientes componentes, el algoritmo identifica al número 90 como el más pequeño y lo intercambia con el valor de la componente ubicada en la quinta posición (arreglo[4]).
3 6.
14
14
16
26
90
98
125
429
El algoritmo vuelve a repetir el proceso para detectar al número 98 como el valor más pequeño de las restantes 12
componentes, y copiarlo en la misma posición en la que se ubica originalmente ( arreglo[5]).
3 7.
14
16
26
90
98
125
429
Si bien el arreglo ya se encuentra completamente ordenado, el algoritmo vuelve a pasar por el arreglo y copia la penúltima componente el valor 125 en la septima posición (arreglo[6]), la misma ubicación que originalmente tenía este número.
3
14
16
26
98
90
125
429
La septima pasada corresponde a la última de las vueltas del algoritmo sobre el arreglo, el cual en este punto ha sido procesado por completo y se encuentra ordenado de forma ascendente.
13