tipos de ordenamiento
DESCRIPTION
ESTRUCTURA DE DATOSTRANSCRIPT
INGENIERÍA ENSISTEMAS COMPUTACIONALES
MATERIA:
“Estructura de Datos”
TEMA:
“METODOS DE ORDENAMIENTO”
TERCER SEMESTRE
PRESENTA:
PORFIRIO AGUILAR TREJOALVARO SANCHEZ SANCHEZ
CESAR SUAREZ GUZMANFERNANDA SANCHEZ SANCHEZMARTHA COYOTL ZINCAXTLE
AJALPAN, PUEBLA, DICIEMBRE DE 2012
2
5 DE DICIEMBRE DE 2012
INDICE
METODOS DE ORDENAMIENTO………………….
Metodo de ordenamiento
burbuja……………
Método de
ShellSort…………………………………..
Método de
QuickSort………………………………….
Método de Intercalacion……….
……………………
3
4
6
10
13
15
3
5 DE DICIEMBRE DE 2012
Método de RadixSort.……………… .
……………….
¿Qué es ordenamiento?
Es la operación de arreglar los elementos en algún orden secuencial de acuerdo a un
criterio de ordenamiento.
El propósito principal de un ordenamiento es el de facilitar las búsquedas de los
miembros del conjunto ordenado. El ordenar un grupo de datos significa mover los datos o sus
referencias para que queden en una secuencia por categorías y en forma ascendente o
descendente.
¿Cuándo conviene usar un método de ordenamiento?
Cuando se requiere hacer una cantidad considerable de búsquedas y es importante el
factor tiempo.
4
5 DE DICIEMBRE DE 2012
METODO DE ORDENAMIENTO BURBUJA
El Ordenamiento de Burbuja (BubbleSort en inglés) es un sencillo algoritmo de
ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada
con el siguiente, intercambiándolos de posición si están en el orden equivocado. Es necesario
revisar varias veces toda la lista hasta que no se necesiten más intercambios, lo cual significa
que la lista está ordenada.
Este algoritmo obtiene su nombre de la forma con la que suben por la lista los
elementos durante los intercambios, como si fueran pequeñas “burbujas". También es
conocido como el método del intercambio directo.
ALGORITMO
Para i = 0 condicion i < (Numero de elementos de a) paso i+1 Hacer
Para j = 0 condición j < (Numero de elementos de a) paso j+1 Hacer
5
5 DE DICIEMBRE DE 2012
Si a[J] > a[J+1] Entonces Hacer
aux = a[J]
a[J] = a[J+1]
a[J+1] = aux
Fin del ciclo Para
Fin del ciclo Para
EJERCICIO
Vemos un ejemplo sencillo. Supongamos que queremos ordenar estos valores con el
algoritmo de la burbuja: 45, 52, 21, 37, 49, así pues, n=5
1. Pasada: comparamos cada uno de los cuatro primeros (n-1) con los que le siguen. Si un
elemento no está en orden con respecto al siguiente, los intercambiamos de sitio y
seguimos. El elemento de mayor valor (52) irá "ascendiendo" hasta la última posición.
45, 52, 21, 37, 49 → Comparar 45 y 52. (1º y 2º) Están en orden. Seguimos.
45, 52, 21, 37, 49 → Comparar 52 y 21. (2º y 3º) No están en orden. Intercambio.
45, 21, 52, 37, 49 → seguimos
45, 21, 52, 37, 49 → Comparar 52 y 37 (3º y 4º). No están en orden. Intercambio.
45, 21, 37, 52, 49 → seguimos
45, 21, 37, 52, 49 → Comparar 52 y 49. (4º y 5º). No están en orden. Intercambio.
45, 21, 37, 49, 52 → Ya hemos terminado esta pasada.
45, 21, 37, 49, 52 → El 5º elemento ya está en su sitio.
2. Pasada: comparamos cada uno de los tres primeros (n-2) con los que le siguen. No
llegamos a hacer comparaciones que involucren al 5º elemento, porque la primera
6
5 DE DICIEMBRE DE 2012
pasada hizo que el mayor de todos los elementos ocupara la última posición, con lo cual,
sabemos que ese ya está en su sitio. Trabajaremos sólo con los cuatro que quedan.
45, 21, 37, 49, 52 → Comparar 1º y 2º. No están en orden. Intercambio.
21, 45, 37, 49, 52 → seguimos
21, 45, 37, 49, 52 → Comparar 2º y 3º. No están en orden. Intercambio.
21, 37, 45, 49, 52 → seguimos
21, 37, 45, 49, 52 → Comparar 3º y 4º. Están en orden. Pasada terminada.
21, 37, 45, 49, 52 → El 4º elemento ya está en su sitio. (Fíjate en que el array ya está en
orden, pero algoritmicamente, eso no lo sabemos).
3. Pasada: Comparamos cada uno de los dos primeros (n-3) con los siguientes.
21, 37, 45, 49, 52 → 1º y 2º. Están en orden. Seguimos.
21, 37, 45, 49, 52 → 2º y 3º. Están en orden. Pasada terminada.
21, 37, 45, 49, 52 → Ya tenemos tres en orden.
4. Ultima pasada: Comparamos el primero con el segundo.
21, 37, 45, 49, 52 → 1º y 2º están en orden. Pasada terminada.
21, 37, 45, 49, 52 → Ya tenemos los cuatro últimos en orden.
21, 37, 45, 49, 52 → Así pues, el primero también lo está.
METODO DE ORDENAMIENTO SHELLSORT
QUE ES EL MÉTODO DE ORDENAMIENTO SHELLSORT.
Debe su nombre al ingeniero y matemático estadounidense Donald Shell, que lo publicó en
la revista Communications of the ACM en 1959.
7
5 DE DICIEMBRE DE 2012
Es un algoritmo de ordenación interna muy sencillo pero muy ingenioso, basado en
comparaciones e intercambios, y con unos resultados radicalmente mejores que los que se
pueden obtener con el método de la burbuja, el de selección directa o el de inserción directa.
Ya que es el mejor algoritmo de ordenación in-situ... es decir, el mejor de aquellos en los que la
cantidad de memoria adicional que necesita aparte de los propios datos a ordenar, claro está es
constante, sea cual sea la cantidad de datos a ordenar.
CARACTERÍSTICAS
Se trata de un algoritmo de ordenación interna. Al igual que cualquier otro de ordenación
interna (los datos están en memoria principal).
Se basa en comparaciones e intercambios.
Necesita que el tiempo de acceso a cualquier dato sea constante (es decir, fue ideado para
trabajar con arrays, arrays de referencias o punteros). En estructuras, como listas enlazadas,
etc.
No es estable: dados dos elementos que al compararlos sean "iguales" no mantienen
necesariamente el orden relativo inicial entre ellos.
El estudio de su complejidad no es trivial, sino todo lo contrario. La implementación original de
Shell tiene una complejidad en el peor caso de O(n2), aunque en un caso promedio o en casos
típicos comprobados empíricamente, los resultados son mucho mejores que con la burbuja,
selección directa o inserción directa, cuya complejidad en el peor caso también es del orden de
O(n2).
ALGORITMO
void
ordenacion_shell (Dato * A, int N)
{
int incr = N / 2, p, j;
Dato tmp;
8
5 DE DICIEMBRE DE 2012
do
{
for (p = incr + 1; p < N; p++)
{
tmp = A[p];
j = p - incr;
while ((j >= 0) && (tmp < A[j]))
{
A[j + incr] = A[j];
7Algoritmos de ordenación
j -= incr;
}
A[j + incr] = tmp;
}
incr /= 2;
}
while (incr > 0);
}
EJEMPLO DEL ALGORITMO
El fundamento: la k-ordenación.
Imaginemos una lista de datos ordenables... por ejemplo, estos enteros:
74, 14, 21, 44, 38, 97, 11, 78, 65, 88, 30
Pueden ser datos de cualquier tipo, siempre y cuando tengan un criterio de ordenación para
compararlos. Cada uno de estos enteros, mantiene una posición en la lista (o array).Los enteros
están comprendidos entre el 11 (el más pequeño) y el 97 (el más grande) y que parecen más o
menos uniformemente distribuidos.
9
5 DE DICIEMBRE DE 2012
La idea básica del ShellSort: si podemos desplazar "a grosso modo" los elementos más grandes
hacia el final y los más pequeños hacia el principio con poco esfuerzo, estaremos dejando cada
elemento más cerca de su ubicación definitiva. Si finalmente aplicamos un método como
InsertionSort, cada elemento se tendrá que desplazar pocos lugares.
Shell nos propone que hagamos sobre el array una serie de ordenaciones basadas en la
inserción directa, pero dividiendo el array original en varios sub-arrays tales que cada elemento
esté separado k elementos del anterior (a esta separación a menudo se le llama salto o gap)...
Se debe empezar con k=n/2, siendo n el número de elementos de array, y utilizando siempre la
división entera.... después iremos variando k haciéndolo más pequeño mediante sucesivas
divisiones por 2, hasta llegar a k=1
En el ejemplo, n=11 (porque hay 11 elementos). Así que k=n/2 = 11/2=5
Empezamos con k=5.Vamos a dividir nuestro array original en 5 sub-arrays, en los cuales, sus
elementos estarán separados por 5 lugares del array original (el salto o gap es 5).
Tomamos el primer elemento (el 74) contamos 5 lugares y tomamos también otro elemento (el
97) volvemos a contar 5 y tomamos otro (el 30).
El primer sub-array con k=5 es el que está formado por 74, 97 y 30. Vamos a pintarlos en rojo
74, 14, 21, 44, 38, 97, 11, 78, 65, 88, 30
Ahora, ordenaremos los elementos del sub-array rojo pero sólo entre ellos, utilizando el
algoritmo de Inserción directa.
30, 14, 21, 44, 38, 74, 11, 78, 65, 88, 97
Formemos ahora otro sub-array con salto k=5.Partiendo del segundo elemento (el 14) contando
5 (tomamos también el 11)
30, 14, 21, 44, 38, 74, 11, 78, 65, 88, 97
Vamos a ordenarlos entre ellos con Inserción directa... el 11 primero y el 14 después.
30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97
Ahora partimos del tercer elemento el 21 y el 78
30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97
Están en orden entre ellos, así que se quedan como están.
Ahora le toca al sub-array formado por el 44 y el 65
10
5 DE DICIEMBRE DE 2012
30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97
Que también están en orden entre ellos... y finalmente el 38 y el 88, que también están en
orden.
30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97
Hemos formado 5 sub-arrays en los cuales los elementos están separados por 5 lugares (porque
k=5). Hemos ordenado cada sub-array por separado utilizando inserción directa, y hemos
logrado que cada elemento se dirija hacia su ubicación definitiva en pasos de 5 lugares.
Ahora el array está 5 ordenado.
Para continuar con el algoritmo, debemos ir reduciendo progresivamente k dividiéndolo
sucesivamente por 2. Cuando lleguemos a k=1 habremos terminado.
El array es 5, así que ahora k←k/2 = 5/2=2
Nueva k vale 2. Ahora nos saldrán 2 sub-arrays cuyos elementos están separados por 2 lugares.
El primero (en marrón) y el segundo (en verde):
30, 11, 21, 44, 38, 74, 14, 78, 65, 88, 97
Ordenamos por un lado los marrones entre ellos y los verdes entre ellos.
14, 11, 21, 44, 30, 74, 38, 78, 65, 88, 97
Ahora, cada número está mucho más cerca de su posición definitiva. Finalmente, calculamos un
nuevo k dividiendo el que tenemos entre 2. K←k/2 = 2/2=1
Hemos llegado a k=1. Cuando k es 1 sólo podemos obtener 1 sub-array cuyos elementos están
separados 1 posición en el propio array original. Cuando k es 1, el algoritmo de Shell se
comporta exactamente igual que el de inserción directa sobre todo el array.
Sin embargo, las k-ordenaciones que hemos hecho (con k=5 y k=2) han hecho que cada
elemento se aproximase con saltos de 5 y luego de 2 posiciones hacia su ubicación definitiva.
Ahora que k=1 y que vamos a aplicar el algoritmo de inserción directa.
Finalmente, el array queda de ésta manera:
11, 14, 21, 30, 38, 44, 65, 74, 78, 88, 97
Cada elemento descolocado ha tenido que moverse pocos lugares.
11
5 DE DICIEMBRE DE 2012
METODO DE QUICKSORT
¿QUE ES ELMETODO DE QUICKSORT?
Este método es una mejora sustancial del método de intercambio directo y recibe el
nombre de Quick Sort por la velocidad con que ordena los elementos del arreglo .es un
algoritmo basado en la técnica de divide y vencerás, que permite, en promedio, ordenar n
elementos en un tiempo proporcional a n log n.
El algoritmo original es recursivo, pero se utilizan versiones iterativas para mejorar su
rendimiento (los algoritmos recursivos son en general más lentos que los iterativos, y
consumen más recursos.
Descripción del algoritmo
1. Elegir un elemento de la lista de elementos a ordenar, al que llamaremos pivote.
2. Resituar los demás elementos de la lista a cada lado del pivote, de manera que a un lado
queden todos los menores que él, y al otro los mayores. Los elementos iguales al pivote
pueden ser colocados tanto a su derecha como a su izquierda, dependiendo de la
implementación deseada. En este momento, el pivote ocupa exactamente el lugar que
le corresponderá en la lista ordenada.
3. La lista queda separada en dos sublistas, una formada por los elementos a la izquierda
del pivote, y otra por los elementos a su derecha.
4. Repetir este proceso de forma recursiva para cada sublista mientras éstas contengan
más de un elemento. Una vez terminado este proceso todos los elementos estarán
ordenados.
EJEMPLO:
Como se puede suponer, la eficiencia del algoritmo depende de la posición en la que
termine el pivote elegido.
12
5 DE DICIEMBRE DE 2012
ALGORITMO
El algoritmo de quicksort. Para ponerlo a prueba puedes utilizar este codigo en tu metodo
Main, mandando a llamar el metodo quicksort de la clase y organizando un arreglo cualquiera.
int array[] ={3,7,3,4,12,6,3,7,4};
Ordenador a = new Ordenador();
a.quicksort(array);
El programa esta diseñado para manejar datos de tipo int, por lo que solo acepta arreglos
de numeros tipo entero.
Análisis del algoritmo:
Estabilidad: No es estable.
Requerimientos de Memoria: No requiere memoria adicional en su forma recursiva. En
su forma iterativa la necesita para la pila.
Ventajas:
Muy rápido.
No requiere memoria adicional.
Desventajas:
Implementación un poco más complicada.
Recursividad (utiliza muchos recursos).
Mucha diferencia entre el peor y el mejor caso.
COMPLEJIDAD
13
5 DE DICIEMBRE DE 2012
En este caso, el orden de complejidad del algoritmo es O(n•log n).
En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del
algoritmo es entonces de O(n²). El peor caso dependerá de la implementación del algoritmo,
aunque habitualmente ocurre en listas que se encuentran ordenadas, o casi ordenadas. Pero
principalmente depende del pivote, si por ejemplo el algoritmo implementado toma como
pivote siempre el primer elemento del array, y el array que le pasamos está ordenado, siempre
va a generar a su izquierda un array vacío, lo que es ineficiente.
METODO MERGESORT,(ORDENAMIENTO POR INTERCALACIÓN).
La estrategia de este algoritmo se basa en el principio de divide y vencerás:
a) Partir la lista por la mitad.
b) Ordenar la sublista de la izquierda.
c) Ordenar la sublista de la derecha.
d) Mezclar las dos sublistas ordenadas en una sola lista ordenada.
La fusión de vectores permite un método de ordenación rápida y potente conocido
por el nombre de ordenación por fusión (MergeSort).
La idea es dividir el vector en dos mitades, a continuación ordenar cada mitad y
después mezclar ambas mitades para obtener un nuevo vector ordenado.
El algoritmo admite una formulación recursiva:
14
5 DE DICIEMBRE DE 2012
Dividir el vector en dos mitades
Ordenar la mitad izquierda
Ordenar la mitad derecha
Mezclar las dos mitades juntas
ALGORITMO
Procedimiento MergeSort (A, Primero, Ultimo).
A: arreglo lineal
Primero: índice al primer elemento
Ultimo: índice al último elemento}
Si A[Primero] < A[Ultimo] entonces
Central = (Primero + Ultimo) / 2
MergeSort (A, Primero, Central)
MergeSort (A, Central + 1, Ultimo)
Mezcla A [Primero… central ] con A[ central+1…Ultimo]
Fin Si
Donde los parámetros del algoritmo Mezcla han sido modificados convenientemente.
EJEMPLO:
15
5 DE DICIEMBRE DE 2012
METODO RADIX SORT
Radix sort es uno de los algoritmos de clasificación para lineales enteros. Funciona mediante la
clasificación de los números de entrada de cada dígito, para cada uno de los dígitos de los
números. Sin embargo, el proceso adoptado por este método de ordenación es poco intuitivo,
en el sentido de que los números se ordenan en el dígito menos significativo primero, seguido
por el segundo al menos dígitos significativos y así sucesivamente hasta que el dígito más
significativo.
EJEMPLO
Supongamos que queremos ordenar una baraja de 52 cartas (los diversos juegos se pueden dar
valores adecuados, por ejemplo, 1, 2 para los diamantes para Clubes, 3 y 4 de corazones para
Spades) .
El 'natural' cosa a hacer sería ordenar primero las tarjetas de acuerdo a los juegos, a
continuación, ordenar cada una de las cuatro pilas separadas, y finalmente combinar los cuatro
en orden.
Este enfoque, sin embargo, tiene una desventaja inherente. Cuando cada uno de los pilotes
está siendo ordenados, las otras pilas tienen que ser mantenido a un lado y se mantiene la
pista.
16
5 DE DICIEMBRE DE 2012
Si, en cambio, seguimos el "contraintuitivo" aproach de la primera clasificación de las tarjetas
de valor, este problema se elimina. Después de la primera etapa, las cuatro pilas separadas se
combinan en el orden y a continuación, por ejemplo.
Si un algoritmo de ordenación estable (es decir, uno que resuelve un lazo manteniendo el
número obtenido en la primera entrada de la primera como en la salida), se puede ver
fácilmente que corregir los resultados finales se obtienen.
Como se ha mencionado, la clasificación del producto de los números de clasificar el menos
significativo al dígito más significativo. Para la clasificación de cada uno de estos grupos de
dígitos, un algoritmo de clasificación estable se necesita. También, los elementos de este grupo
para ser ordenados están en el intervalo fijo de 0 a 9. Ambas características punto hacia el uso
de Counting Sort como el algoritmo de ordenación de elección para la clasificación de cada
dígito (Si usted no ha leído la descripción en contar Ordenar hecho, por favor hágalo ahora).
ALGORITMO
RADIX-SORT(A,d)
1 for i - 1 to d
utilice una ordenación estable para ordenar el Array A en cifras i
COMPLEJIDAD
La complejidad temporal del algoritmo es el siguiente: Supongamos que los números de
entrada n tiene k dígitos como máximo. A continuación, el procedimiento se llama Ordenar
Contando con un total de k veces. Contando Ordenar es lineal, o O (n) algoritmo. Así que todo
el procedimiento Radix Ordenar toma O (kn) tiempo. Si los números son de tamaño finito, el
algoritmo se ejecuta en O (n) tiempo asintótica.
17
5 DE DICIEMBRE DE 2012
Una representación gráfica de todo el procedimiento se ha proporcionado en el applet adjunto.
Este programa tiene 8 enteros generados aleatoriamente 3 dígitos como entrada y los ordena
utilizando Ordenar Radix.