El método de ordenamiento por selección consiste en encontrar el menor de todos los elementos del arreglo e intercambiarlo con el que está en la primera posición y así excluirlo de la lista. Luego el segundo mas pequeño, y así sucesivamente hasta ordenar todo el arreglo.
Es un algoritmo lento, a pesar que sólo realiza un intercambio en cada ejecución del ciclo externo, puede ser una buena elección para listas con registros grandes y claves pequeñas.
ALGORITMO SELECCIÓN
INICIO
ENTERO I, J, MIN, ARREGLO[N]
I ß 0
MIENTRAS(I < N)
{
MIN ß I
J ß I + 1
MIENTRAS(J < N)
{
SI(ARREGLO[J] < ARREGLO[I])
{
MIN ß J
INTERCAMBIA(ARREGLO[MIN],ARREGLO[I])
}
J ß J + 1
}
I ß I + 1
}
FIN
void seleccion(void)
{
int i, j, min, ARREGLO[N], aux;
i = 0
while(i < N)
{
min = i;
j = i + 1;
while (j < N)
{
if(ARREGLO[j] < ARREGLO[i])
{
min = j;
aux = ARREGLO[i];
ARREGLO[i] = ARREGLO[min];
ARREGLO[min] = aux;
}
j++;
}
i++;
}
}
Ejemplo:
|
[0] |
15 |
ð 10 |
10 |
10 |
ð 7 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
7 |
|
[1] |
10 |
ð 15 |
15 |
15 |
15 |
15 |
ð 14 |
ð 11 |
ð 10 |
10 |
10 |
10 |
10 |
10 |
10 |
|
[2] |
14 |
14 |
14 |
14 |
14 |
14 |
ð 15 |
15 |
15 |
15 |
ð 14 |
ð 11 |
11 |
11 |
11 |
|
[3] |
11 |
11 |
11 |
11 |
11 |
11 |
11 |
ð 14 |
14 |
14 |
ð 15 |
15 |
15 |
ð 14 |
14 |
|
[4] |
7 |
7 |
7 |
7 |
ð 10 |
10 |
10 |
10 |
ð 11 |
11 |
11 |
ð 14 |
14 |
ð 15 |
15 |
|
ê |
ê |
ê |
ê |
ê |
|||||||||||
|
I |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
2 |
2 |
2 |
3 |
3 |
4 |
|
J |
1 |
1 |
2 |
3 |
4 |
2 |
2 |
3 |
4 |
3 |
3 |
4 |
4 |
4 |
5 |
|
MIN |
0 |
0 |
1 |
1 |
4 |
1 |
2 |
3 |
4 |
2 |
3 |
4 |
3 |
4 |
4 |
Tiempo de Ejecución: El ciclo externo se ejecuta n veces para una lista de n elementos. Cada búsqueda requiere comparar todos los elementos no clasificados. Luego la complejidad es O(n2). Este algoritmo presenta un comportamiento constante independiente del orden de los datos.
Estabilidad: Puede que haya algo de discrepancia pero esta implementación parece ser estable, puede verificar esto ordenando un conjunto de datos que tenga un par de ellos con la misma clave, el orden relativo entre ellos es conservado, pero algunos autores dicen que no es estable.
Ventajas:
Desventajas:
Conocido como doble ordenamiento de burbuja; recorre el arreglo intercambiando los elementos adyacentes que estén desordenados. Se recorre el arreglo tantas veces hasta que ya no haya cambios. Prácticamente lo que hace es tomar el elemento mayor y lo coloca en su posición y al mismo tiempo también coloca el elemento menor en su posición.
ALGORITMO SHAKE
INICIO
ENTERO I ß 0, ARREGLO[N]
ENTERO K ß N - 1
ENTERO MIN, MAX, J, AUX
MIENTRAS(I < K)
{
MIN ß I
MAX ß I
PARA(J ß I + 1, HASTA K, J ß J + 1)
{
SI(ARREGLO[J] < ARREGLO[MIN])
{
MIN ß J
}
SI(ARREGLO[J] > ARREGLO[MAX])
{
MAX ß J
}
}
AUX ß ARREGLO[MIN]
ARREGLO[MIN] ß ARREGLO[I]
ARREGLO[I] ß AUX
SI(MAX ß I)
{
AUX ß ARREGLO[MIN]
ARREGLO[MIN] ß ARREGLO[K]
ARREGLO[K] ß AUX
}
SI NO
{
AUX ß ARREGLO[MAX]
ARREGLO[MAX] ß ARREGLO[K]
ARREGLO[K] ß AUX
}
I ß I + 1;
K ß K - 1;
}
}
void shake(void)
{
int i = 0, ARREGLO[N];
int k = N - 1;
int min, max, j, aux;
while (i < k)
{
min = i;
max = i;
for(j = i + 1; j <= k; j++)
{
if (ARREGLO[j] < ARREGLO[min])
min = j;
if (ARREGLO[j] > ARREGLO[max])
max = j;
}
aux = ARREGLO[min];
ARREGLO[min] = ARREGLO[i];
ARREGLO[i] = aux;
if (max == i)
{
aux = ARREGLO[min];
ARREGLO[min] = ARREGLO[k];
ARREGLO[k] = aux;
}
else
{
aux = ARREGLO[max];
ARREGLO[max] = ARREGLO[k];
ARREGLO[k] = aux;
}
i++;
k--;
}
}
Ejemplo:
|
[0] |
15 |
ð 7 |
7 |
|||||||
|
[1] |
10 |
10 |
10 |
|||||||
|
[2] |
14 |
14 |
ð 11 |
|||||||
|
[3] |
11 |
11 |
ð 14 |
|||||||
|
[4] |
7 |
ð 15 |
15 |
|||||||
|
ê |
ê |
ê |
||||||||
|
I |
0 |
1 |
2 |
|||||||
|
K |
4 |
3 |
2 |
|||||||
|
J |
1 |
2 |
3 |
4 |
2 |
3 |
4 |
3 |
||
|
MIN |
0 |
1 |
4 |
1 |
2 |
|||||
|
MAX |
0 |
1 |
2 |
2 |
Tiempo de ejecución:
El bucle interno se efectuará
; el bucle interior se ejecutará
entonces por la regla de la multiplicación tenemos
Þ
O(n2)
Ventajas:
Estabilidad: Es inestable no mantiene el orden relativo de los registros.
Desventajas:
Ordenamiento por intervalos decrecientes, nombrado así debido a su inventor Donald Shell, este algoritmo ordena subgrupos de elementos separados K unidades respecto de su posición en el arreglo. El valor K es llamado intervalo. Después de que los primeros K subgrupos fueron ordenados generalmente utilizando Inserción Directa, se escoge un nuevo valor de K más pequeño, y el arreglo es de nuevo partido entre el nuevo conjunto de subgrupos. Cada uno de los subgrupos mayores es ordenado y el proceso se repite de nuevo con un valor más pequeño de K.
Cuando el incremento toma un valor de 1, todos los elementos pasan a formar parte del subgrupo y se aplica inserción directa. El método se basa en tomar como salto al principio N/2, siendo N el número de elementos, y luego se va reduciendo a la mitad en cada repetición hasta lograr un valor de 1.
ALGORITMO SHELL
INICIO
ENTERO INTERVALO, K, J, I, AUX
INTERVALO ß N DIV 2
MIENTRAS(INTERVALO > 0)
{
PARA(I ß INTERVALO – 1, HASTA ß N, I ß I + 1)
{
J ß I - INTERVALO
MIENTRAS(J >= 0)
{
K ß J + INTERVALO
SI(VECTOR[K] <= VECTOR[J])
{
AUX ß VECTOR[J]
VECTOR[J] ß VECTOR[K]
VECTOR[K] ß AUX
}
SI NO
{
J ß 0
}
J ß J - INTERVALO
}
}
INTERVALO ß INTERVALO DIV 2
}
}
void shell(void)
{
int intervalo, k, j, i, aux;
intervalo = RANGO / 2;
while(intervalo > 0)
{
for(i = intervalo - 1; i < RANGO; i++)
{
j = i - intervalo;
while(j >= 0)
{
k = j + intervalo;
if(vector[k] <= vector[j])
{
aux = vector[j];
vector[j] = vector[k];
vector[k] = aux;
}
else
j = 0;
j = j - intervalo;
ver_valores(vector);
}
}
intervalo = intervalo / 2;
}
}
Ejemplo:
|
[0] |
15 |
15 |
7 |
7 |
7 |
|||||||||||||||
|
[1] |
10 |
10 |
10 |
10 |
10 |
|||||||||||||||
|
[2] |
14 |
7 |
15 |
11 |
11 |
|||||||||||||||
|
[3] |
11 |
11 |
11 |
15 |
14 |
|||||||||||||||
|
[4] |
7 |
14 |
14 |
14 |
15 |
|||||||||||||||
|
ê |
ê |
ê |
ê |
ê |
ê |
ê |
ê |
ê |
||||||||||||
|
I |
1 |
2 |
3 |
4 |
0 |
1 |
2 |
3 |
4 |
|||||||||||
|
J |
-1 |
-2 |
0 |
-2 |
1 |
-2 |
2 |
0 |
-2 |
-1 |
0 |
-2 |
1 |
-2 |
2 |
1 |
-2 |
3 |
2 |
-2 |
|
K |
1 |
2 |
3 |
4 |
2 |
0 |
1 |
2 |
3 |
2 |
4 |
3 |
||||||||
|
INTERVALO |
2 |
2 |
2 |
2 |
1 |
1 |
1 |
1 |
1 |
Tiempo de ejecución:
El bucle externo se ejecutará, el redondeo de
veces, el interno n veces, luego el bucle mas interno depende de j Þ
j O(n) la constante j se absorbe, luego tenemos O
* o(n) Þ
O(n2)
Ventajas:
Estabilidad: Es inestable no mantiene el orden relativo de los registros.
Desventajas:
Ed. McGraw-Hill. 2000.
Autor:
Rolf Pinto López
Ingeniero de Sistemas
Trabajos relacionados
Ver mas trabajos de Programacion |
|
Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.