SORT / ORDENACION. - Docencia FCA-UNAM

Download Report

Transcript SORT / ORDENACION. - Docencia FCA-UNAM

MÉTODOS DE CLASIFICACION
DE DATOS
(sort)
EI, Profesor Ramón Castro Liceaga
QUE SON ORDENAMIENTOS DE DATOS ?
SORT / ORDENACION.Es reagrupar un grupo de datos en una
secuencia especifica de orden
(mayor -> menor o menor -> mayor)
EI, Profesor Ramón Castro Liceaga
LA ORDENACION DE ELEMENTOS PUEDE SER:
• Ordenación Interna.- En memoria
principal (arrays, listas).
• Ordenación Externa.- En memoria
secundaria. (dispositivos de
almacenamiento externo.- archivos y
Bases de datos).
EI, Profesor Ramón Castro Liceaga
TIPOS DE ORDENACION
Los mas usuales son:
•
POR INTERCAMBIO (Compara e intercambia elementos.- Burbuja)
•
POR SELECCIÓN (Selecciona el mas pequeño y lo intercambia)
•
POR INSERSION (Inserta los elementos en una sublista ordenada)
•
METODO SHELL (Es una insersión mejorada)
•
ORDENACION RAPIDA (Quick Sort.- divide una lista en dos partes)
EI, Profesor Ramón Castro Liceaga
ALGORITMO DE EJEMPLO DE UN ORDENAMIENTO
PROBLEMA:
En una Empresa el área de Recursos
Humanos requiere ordenar 3
números de empleados obteniendo la
siguiente salida.
EI, Profesor Ramón Castro Liceaga
POR INTERCAMBIO (Burbuja o bubble sort )
El bubble sort, también conocido como ordenamiento
burbuja, funciona de la siguiente manera:
• Se va comparando cada elemento del arreglo con el
siguiente; si un elemento es mayor que el que le sigue,
entonces se intercambian; esto producirá que en el
arreglo quede como su último elemento, el más grande.
•
Este proceso deberá repetirse recorriendo todo el
arreglo hasta que no ocurra ningún intercambio.
• Los elementos que van quedando ordenados ya no se
comparan. "Baja el más pesado".
EI, Profesor Ramón Castro Liceaga
EJEMPLO: Ordenamiento por Burbuja o bubble sort
Consiste en comparar pares de elementos adyacentes e intercambiarlos
entre sí hasta que estén todos ordenados.
Sea un array de 6 números de empleados: {40,21,4,9,10,35}:
Primera pasada:
{21,40,4,9,10,35} <-- Se cambia el 21 por el 40.
{21,4,40,9,10,35} <-- Se cambia el 40 por el 4.
{21,4,9,40,10,35} <-- Se cambia el 9 por el 40.
{21,4,9,10,40,35} <-- Se cambia el 40 por el 10.
{21,4,9,10,35,40} <-- Se cambia el 35 por el 40.
Segunda pasada:
{4,21,9,10,35,40} <-- Se cambia el 21 por el 4.
{4,9,21,10,35,40} <-- Se cambia el 9 por el 21.
{4,9,10,21,35,40} <-- Se cambia el 21 por el 10.
Ya están ordenados, pero para comprobarlo habría que acabar esta segunda
comprobación y hacer una tercera.
EI, Profesor Ramón Castro Liceaga
// Definimos una función donde A=arreglo y N=tamaño
int bubblesort(int A[],int N){
int i,j,AUX;
for(i=2;i<=N;i++){ //avanza
for(j=N;j>=i;j--){ //retrocede
if(A[j-1]>A[j]){ //si a > p intercambio
AUX=A[j-1];
A[j-1]=A[j];
A[j]=AUX;
}
}
}
return 1;
}
EI, Profesor Ramón Castro Liceaga
Práctica No. 03
• Hacer un programa que ordene por el método de la burbuja
Bubblesort en forma ascendente un vector de 10 números de
empleados de una empresa.
Algoritmo:
1.- Llenar el vector con los 10 números de los empleados
2.- Mostrar los números a ordenar
3.- Ordenar el vector por el método bubblesort
4.- Mostrar el vector ordenado en forma ascendente
Actividades adicionales:
a) hacer un ordenamiento descendete para 30 empleados.
b) Hacer un ordenamiento ascendente para 20 nombres de empleados con 15 caracteres c/u
Tiempo aprox. 15 mts.
EI, Profesor Ramón Castro Liceaga
POR SELECCION
• Este algoritmo trabaja seleccionando el dato más pequeño
a ser ordenado que aún esta en la lista, y luego haciendo
un intercambio con el elemento en la siguiente posición.
ejemplo, si tenemos el array {40,21,4,9,10,35}, los pasos a seguir son
:
{4,21,40,9,10,35} <-- Se coloca el 4, el más pequeño, en primera
posición : se cambia el 4 por el 40.
{4,9,40,21,10,35} <-- Se coloca el 9, en segunda posición: se cambia el
9 por el 21.
{4,9,10,21,40,35} <-- Se coloca el 10, en tercera posición: se cambia
el 10 por el 40.
{4,9,10,21,40,35} <-- Se coloca el 21, en tercera posición: ya está colocado.
{4,9,10,21,35,40} <-- Se coloca el 35, en tercera posición: se cambia
el 35 por el 40.
EI, Profesor Ramón Castro Liceaga
Código fuente por selección.
void selectionSort(int numbers[], int array_size)
{
int i, j;
int min, temp;
for (i = 0; i < array_size-1; i++){
min = i;
for (j = i+1; j < array_size; j++){
if (numbers[j] < numbers[min]){
min = j;
temp = numbers[i];
numbers[i] = numbers[min];
numbers[min] = temp;
}
}
}
EI, Profesor Ramón Castro Liceaga
POR INSERSION
• El insertion sort trabaja insertando el numero en su lugar
correspondiente al final de una sublista ordenada.
En este método lo que se hace es tener una sublista ordenada de
elementos del array e ir insertando el resto en el lugar adecuado
para que la sublista no pierda el orden. La sublista ordenada se va
haciendo cada vez mayor, de modo que al final la lista entera
queda ordenada.
Para el ejemplo {40,21,4,9,10,35}, se tiene:
{40,21,4,9,10,35} <-- La primera sublista ordenada es {40}.
Insertamos el 21:
{40,40,4,9,10,35} <-- aux=21;
{21,40,4,9,10,35} <-- Ahora la sublista ordenada es {21,40}.
Insertamos el 4:
{21,40,40,9,10,35} <-- aux=4;
EI, Profesor Ramón Castro Liceaga
POR INSERSION (continuacion)
{21,21,40,9,10,35} <-- aux=4;
{4,21,40,9,10,35} <-- Ahora la sublista ordenada es {4,21,40}.
Insertamos el 9:
{4,21,40,40,10,35} <-- aux=9;
{4,21,21,40,10,35} <-- aux=9;
{4,9,21,40,10,35} <-- Ahora la sublista ordenada es {4,9,21,40}.
Insertamos el 10:
{4,9,21,40,40,35} <-- aux=10;
{4,9,21,21,40,35} <-- aux=10;
{4,9,10,21,40,35} <-- Ahora la sublista ordenada es {4,9,10,21,40}.
Y por último insertamos el 35:
{4,9,10,21,40,40} <-- aux=35;
{4,9,10,21,35,40} <-- El array está ordenado.
EI, Profesor Ramón Castro Liceaga
Código fuente.
void insertionSort(int numbers[], int array_size)
{
int i, j, index;
for (i=1; i < array_size; i++){
index = numbers[i];
j = i;
while ((j > 0) && (numbers[j-1] > index)) {
numbers[j] = numbers[j-1];
j = j - 1;
}
numbers[j] = index;
}
}
EI, Profesor Ramón Castro Liceaga
POR METODO SHELL (Ordenamiento por bloques de datos)
• El algoritmo realiza multiples pases a través de la lista,
y en cada pasada ordena un numero igual de items. El
tamaño del set de datos (también llamado distancia o
intervalo) a ser ordenado va creciendo a medida que el
algoritmo recorre el array hasta que finalmente el set
esta compuesto por todo el array en si mismo. El
tamaño del set de datos usado tiene un impacto
significativo en la eficiencia del algoritmo. Algunas
implementaciones de este algoritmo tienen una función
que permite calcular el tamaño óptimo del set de datos
para un array determinado.
EI, Profesor Ramón Castro Liceaga
POR METODO SHELL
Por ejemplo, lo pasos para ordenar el array {40,21,4,9,10,35}
mediante el método de Shell serían:
Salto=3:
Primera pasada:
{9,21,4,40,10,35} <-- se intercambian el 40 y el 9.
{9,10,4,40,21,35} <-- se intercambian el 21 y el 10.
Salto=1:
Primera pasada:
{9,4,10,40,21,35} <-- se intercambian el 10 y el 4.
{9,4,10,21,40,35} <-- se intercambian el 40 y el 21.
{9,4,10,21,35,40} <-- se intercambian el 35 y el 40.
Segunda pasada:
{4,9,10,21,35,40} <-- se intercambian el 4 y el 9.
Con sólo 6 intercambios se ha ordenado el array, cuando por
inserción se necesitaban muchos más.
EI, Profesor Ramón Castro Liceaga
void shellSort(int numbers[], int array_size)
{
int i, j, increment, temp;
increment = 3;
while (increment > 0)
{
for (i=0; i < array_size; i++)
{
j = i;
temp = numbers[i];
while ((j >= increment) && (numbers[j-increment] > temp))
{
numbers[j] = numbers[j - increment];
j = j - increment;
}
numbers[j] = temp;
}
if (increment/2 != 0)
increment = increment/2;
else if (increment == 1)
increment = 0;
else
increment = 1;
}
}
EI, Profesor Ramón Castro Liceaga
ORDENACION RAPIDA (Quick Sort) algoritmo recursivo.
• El Quick sort es un algoritmo del estilo divide y
venceras. Es bastante más rápido que el merge sort.
El algoritmo de recursión consiste en una serie de cuatro
pasos:
1. Si hay menos de un elemento a ser ordenado retorna
inmediatamente (termina).
2. Tomar un elemento del vector que sirve como “muestra”
3. Dividir el array en dos partes, una con los elementos
mayores y una con los elementos menores al muestra.
4. Repite recursivamente el algoritmo para las dos mitades
del array original hasta que queda ordenado.
EI, Profesor Ramón Castro Liceaga
Actividad adicional:
Hacer un programa en C, C++ que muestre
un menú que integre los métodos de
ordenamientos anteriormente vistos.
EI, Profesor Ramón Castro Liceaga
GRACIAS POR TU ATENCION …
EI, Profesor Ramón Castro Liceaga