Anda di halaman 1dari 19

ICIN 082

Programación Avanzada
Semestre 2006/02- Prof.: Oscar Mapocho Salazar Cerna - mapocho@gmail.com

Clase 7
Algoritmos de Ordenamiento

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Introducción

• Ordenamiento es una labor común


• La realizamos continuamente, todos los
días
• Pero, ¿Qué es ordenar?
– Ubicar información de una manera especial
basándonos en un criterio de ordenamiento
– …y ¿Quién soy yo? ¿Para qué sirvo?
• Existen muchas técnicas y formas

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Conceptos necesarios

• Clave:
– La parte de un registro por la cual se ordena la
lista.
– Por ejemplo:
• Una lista de registros con campos nombre,
dirección y teléfono se puede ordenar
alfabéticamente de acuerdo a la clave nombre.
• En este caso los campos dirección y teléfono no se
toman en cuenta en el ordenamiento.

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Más conceptos necesarios

• Criterio de ordenamiento (o de
comparación):
– Se utiliza para asignar valores a los registros
con base en una o más claves.
– De esta manera se decide si un registro es
mayor o menor que otro.

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Y más conceptos necesarios

• Registro:
– Un grupo de datos que forman la lista.
– Pueden ser datos atómicos (enteros, caracteres,
reales, etc.) o grupos de ellos: objetos.

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Evaluando algoritmos

• Se debe tener una forma de evaluar algoritmos, antes de


pasarlos a código, que se base en aspectos
independientes de la plataforma o el lenguaje.
• De esta manera podremos decidir cuál se adapta mejor a
los requerimientos de nuestro programa.
– Estabilidad:
Estabilidad Cómo se comporta con registros que tienen claves
iguales.
– Tiempo de ejecució
ejecución: La complejidad del algoritmo, que tiene que
ver con rendimiento.
• O(1) : Complejidad constante.
• O(n2) : Complejidad cuadrática.
• O(n * log(n)) : Complejidad logarítmica.
– Requerimientos de memoria:
memoria El algoritmo puede necesitar
memoria adicional para realizar su labor.

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Algoritmos más comunes

• Ordenamiento Burbuja (Bubblesort)


Complejidad: O(n2)
– Complejidad
– Estabilidad:
Estabilidad Estable
– Memoria adicional:
adicional No
• Ordenamiento por Selecció
Selección
Complejidad: O(n2)
– Complejidad
– Estabilidad:
Estabilidad No Estable
– Memoria adicional:
adicional No
• Ordenamiento por Inserció
Inserción
Complejidad: O(n2)
– Complejidad
– Estabilidad:
Estabilidad Estable
– Memoria adicional:
adicional No
• Ordenamiento Rápido (Quicksort
Quicksort)
Quicksort
– Complejidad:
Complejidad O(n * log2(n))
– Estabilidad:
Estabilidad No Estable
– Memoria adicional:
adicional No

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Ordenamiento Burbuja (Bubblesort)

• Parece una “burbuja” porque el máximo se va moviendo


• Pseudocódigo:
– Variables a emplear:
• lista: lista a ordenar
• TAM: tamaño de la lista
• i: contador
• j: contador
• temp: para realizar intercambios
– Código:
• for (i=1; i<TAM; i++)
– for j=0 ; j<TAM - 1; j++)
– if (lista[j] > lista[j+1])
» temp = lista[j];
» lista[j] = lista[j+1];
» lista[j+1] = temp;
• Ejemplo:
4-3-5-2-1
3-4-5-2-1
3-4-2-5–1
3-4-2-1–5

3-2-1-4-5
2-1-3-4-5
1-2-3-4-5

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Análisis del método

• Estabilidad:
– Este algoritmo nunca intercambia registros con claves
iguales. Por lo tanto es estable.
estable
• Requerimientos de Memoria:
– Este algoritmo sólo requiere de una variable adicional
para realizar los intercambios.
• Tiempo de Ejecución:
– El ciclo interno se ejecuta n veces para una lista de n
elementos.
– El ciclo externo también se ejecuta n veces.
– Es decir, la complejidad es n * n = O(n2).

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


A programar el método en
C#

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Ordenamiento por Selección

• También es sencillo
• Buscar el elemento más pequeño de la lista.
• Intercambiarlo con el elemento ubicado en la primera posición de la lista.
• Buscar el segundo elemento más pequeño de la lista.
• Intercambiarlo con el elemento que ocupa la segunda posición en la lista.
• Repetir este proceso hasta que hayas ordenado toda la lista.
• for (i=0; i<TAM - 1; i++)
pos_men = Menor(lista, TAM, i);
temp = lista[i];
lista[i] = lista [pos_men];
lista [pos_men] = temp;

Ejemplo:
4-3-5-2-1
1-3-5-2-4
1-2-5-3-4
1-2-3-5-4
1-2-3-4-5

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Análisis del método

• Estabilidad:
– Ess estable.
estable
• Requerimientos de Memoria:
– Este algoritmo sólo requiere de una variable adicional
para realizar los intercambios.
• Tiempo de Ejecución:
– El ciclo interno se ejecuta n veces para una lista de n
elementos.
– Cada búsqueda requiere comparar todos los
elementos no clasificados.
– Luego, la complejidad es n * n = O(n2).

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


A programar el método en
C#

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Ordenamiento por Inserción

• También es sencillo
• Parto con una lista de un elemento.
• Se inserta el siguiente elemento de acuerdo a su orden.
• Repetir con cada elemento.
for (i=1; i<TAM; i++)
temp = lista[i];
j = i - 1;
while ( (lista[j] > temp) && (j >= 0) )
lista[j+1] = lista[j];
j--;
lista[j+1] = temp;

Ejemplo:
4-3-5-2-1
4-4-5-2-1
3-4-5-2-1
3-4-5-5-1
3-4-4-5-1
3-3-4-5-1
2-3-4-5-1
2-3-4-5-5
2-3-4-4-5
2-3-3-4-5
2-2-3-4-5
1-2-3-4-5

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Análisis del método

• Estabilidad:
– Ess estable.
estable
• Requerimientos de Memoria:
– Una variable adicional para realizar los intercambios.
• Tiempo de Ejecución:
– Para una lista de n elementos el ciclo externo se
ejecuta n-1 veces.
– El ciclo interno se ejecuta como máximo una vez en la
primera iteración, 2 veces en la segunda, 3 veces en la
tercera, etc.
– Luego, la complejidad es n * n = O(n2).

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


A programar el método en
C#

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Quicksort

• Recorrer lista simultáneamente con i y j:


– Por la izquierda con i (desde el primer elemento)
– Por la derecha con j (desde el último elemento)
• Cuando valor[i] sea mayor que el elemento de
división y valor[j] sea menor intercambiar.
• Repetir esto hasta que se crucen los índices.
• El punto en que se cruzan los índices es la
posición adecuada para colocar el elemento de
división, porque sabemos que a un lado los
elementos son todos menores y al otro son todos
mayores (o habrían sido intercambiados).

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Quicksort en pseudolenguaje

void QuickSort( lista a ordenar (lista), índice inferior (inf), índice superior (sup))
elem_div = lista[sup];
i = inf - 1;
j = sup;
cont = 1;

// Verificamos que no se crucen los límites


if (inf >= sup)
retornar;

// Clasificamos la sublista
while (cont)
while (lista[++i] < elem_div);
while (lista[--j] > elem_div);
if (i < j)
temp = lista[i];
lista[i] = lista[j];
lista[j] = temp;
else
cont = 0;

// Copiamos el elemento de división


// en su posición final
temp = lista[i];
lista[i] = lista[sup];
lista[sup] = temp;

// Aplicamos el procedimiento
// recursivamente a cada sublista
QuickSort (lista, inf, i - 1);
QuickSort (lista, i + 1, sup);

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt


Análisis del método

• Estabilidad:
– No es estable.
• Requerimientos de Memoria:
– No requiere memoria adicional en su
forma recursiva.
• Tiempo de Ejecución:
– n log2n

Depto. Ingeniería Industrial - Universidad Austral de Chile - Campus Puerto Montt

Anda mungkin juga menyukai