tipos de ordenamiento

22
INGENIERÍA EN SISTEMAS COMPUTACIONALES MATERIA: “Estructura de Datos” TEMA: “METODOS DE ORDENAMIENTO” TERCER SEMESTRE PRESENTA: PORFIRIO AGUILAR TREJO ALVARO SANCHEZ SANCHEZ

Upload: porfis-aguilar-trejo

Post on 05-Aug-2015

36 views

Category:

Documents


0 download

DESCRIPTION

ESTRUCTURA DE DATOS

TRANSCRIPT

Page 1: TIPOS DE ORDENAMIENTO

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

Page 2: TIPOS DE ORDENAMIENTO

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

Page 3: TIPOS DE ORDENAMIENTO

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.

Page 4: TIPOS DE ORDENAMIENTO

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

Page 5: TIPOS DE ORDENAMIENTO

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

Page 6: TIPOS DE ORDENAMIENTO

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.

Page 7: TIPOS DE ORDENAMIENTO

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;

Page 8: TIPOS DE ORDENAMIENTO

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.

Page 9: TIPOS DE ORDENAMIENTO

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

Page 10: TIPOS DE ORDENAMIENTO

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.

Page 11: TIPOS DE ORDENAMIENTO

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.

Page 12: TIPOS DE ORDENAMIENTO

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

Page 13: TIPOS DE ORDENAMIENTO

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:

Page 14: TIPOS DE ORDENAMIENTO

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:

Page 15: TIPOS DE ORDENAMIENTO

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.

Page 16: TIPOS DE ORDENAMIENTO

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.

Page 17: TIPOS DE ORDENAMIENTO

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.