Metodos Java

download Metodos Java

of 25

description

Programacion en java

Transcript of Metodos Java

Ordenamiento de burbuja

1).Ordenamiento de burbuja

ElOrdenamiento de burbuja(Bubble Sorten ingls) es un sencilloalgoritmo de ordenamiento. Funciona revisando cada elemento de la lista que va a ser ordenada con el siguiente, intercambindolos de posicin si estn en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten ms intercambios, lo cual significa que la lista est ordenada. Estealgoritmoobtiene su nombre de la forma con la que suben por la lista los elementos durante los intercambios, como si fueran pequeas "burbujas". Tambin es conocido como elmtodo del intercambio directo. Dado que solo usa comparaciones para operar elementos, se lo considera un algoritmo de comparacin, siendo el ms sencillo de implementar.

Descripcin

Una manera simple de expresar el ordenamiento de burbuja enpseudocdigoes la siguiente:

Este algoritmo realiza el ordenamiento de una listaadenvalores, en este caso dentrminos numerados del0aln-1, consta de dos bucles anidados uno con el ndicei, que da un tamao menor al recorrido de la burbuja en sentido inverso de2an, y un segundo loop con el ndicej, con un recorrido desde0hastan-i, para cada iteracin del primer bucle, que indica el lugar de la burbuja.

La burbuja son dos trminos de la lista seguidos,jyj+1, que se comparan, si el primero es menor que el segundo sus valores se intercambian.

Esta comparacin se repite en el centro de los dos bucles, dando lugar a la postre a una lista ordenada, puede verse que el nmero de repeticiones sola depende den, y no del orden de los trminos, esto es si pasamos al algoritmo una lista ya ordenada, realizara todas las comparaciones exactamente igual que para una lista no ordenada, esta es una caracterstica de este algoritmo, luego verano una variante que evita este inconveniente.

Para comprender el funcionamiento, veamos un ejemplo sencillo:

Tenemos una lista de nmeros que hay que ordenar:

Podemos ver que la lista que tiene cinco trminos, luego:

El ndiceihar un recorrido de2hastan:

Que en este caso ser de 2 a 5. Para cada uno de los valores dei,jtomara sucesivamente los valores de0hastan-i:

Para cada valor dej, obtenido en ese orden, se compara el valor del ndicejcon el siguiente:

Si el terminojes menor, en su caso podra se mayor, que el terminoj+1, los valores se permutan, en caso contrario se contina con la iteracin.

Para el caso del ejemplo, tenemos que:

Para la primera iteracin del primer bucle:

yjtomara los valores de0hasta3:

Cuandojvale0, se comparan, el 55 y el 86, dado que 55 < 86 no se permutan el orden.

Ahorajvale1y se comparanel 86 y el 48 Como 86 > 48, se permutan, dando lugar a una nueva lista.

Se repite el proceso hasta quejvalga3, dando lugar a una re lista super ordenada, podemos ver que el termino de mayor valor esta en el lugar ms alto.

Ahoraivale3, yjhar un recorrido de0a2.

Primerojvale0, se comparan, el 55 y el 48, como 55 > 48 se permutan dando lugar a la nueva lista.

Para j = 1 se compara el 55 con el 16 y se cambian de orden.

Para j = 2 se compara el 55 y el 82 y se dejan como estn, finalizando el bucle con una lista mejor ordenada, puede verse que los dos valores ms altos ya ocupan su lugar. No se ha realizado ninguna comparacin con el termino cuarto, dado que ya se sabe que despus del primer ciclo es el mayor de la lista.

El algoritmo consiste en comparaciones sucesivas de dos trminos consecutivos, ascendiendo de abajo a arriba en cada iteracin, como la ascensin de las burbujas de aire en el agua, de ah el nombre del procedimiento, en la primera iteracin el recorrido ha sido completo, en el segundo se ha dejado l ltimo termino, al tener ya el mayor de los valores, en los sucesivos s ira dejando re realizar las ultimas comparaciones, como se puede ver.

Ahora yaivale 4 yjrecorrer los valores de 0 a 1.

Cuandojvale 0, se comparanesto es el 48 y el 16 dado que 48 es mayor que 16 se permutan los valores, dando lugar a una lista algo ms ordenada que la anterior, desde esta nueva ordenacin,jpasa a valer 1, con lo que se comparan los trminosel 48 y el 55 que quedan en el mismo orden.

En este caso la burbuja ha ascendido menos que en los casos anteriores, y la lista esta ya ordenada, pero el algoritmo tendr que completarse, realizando una ultima iteracin.

Hay que tener en cuenta que el bucle para realiza un nmero fijo de repeticiones y para finalizar tendrn que completarse, aun en el caso extremo, de que la lista estara previamente ordenada.

Por ltimoivale 5 yjsolo puede vale 0, con lo que solo se realizara una comparacin deel 16 y el 48, que ya estn ordenados y se dejan igual.

Los bucles finalizan y tambin el procedimiento, dejando la lista ordenada.

Una variante que finaliza en caso de que la lista este ordenada, puede ser la siguiente, empleando un centinelaordenado, que detecta que no se ha modificado la lista en un recorrido de la burbuja, y que por tanto la lista ya esta ordenada, finalizando.

2). Ordenamiento por insercin

Elordenamiento por insercin(insertion sorteningls) es una manera muy natural de ordenar para un ser humano, y puede usarse fcilmente para ordenar un mazo de cartas numeradas en forma arbitraria. Requiere O(n) operaciones para ordenar una lista de n elementos.

Inicialmente se tiene un solo elemento, que obviamente es un conjunto ordenado. Despus, cuando haykelementos ordenados de menor a mayor, se toma el elementok+1y se compara con todos los elementos ya ordenados, detenindose cuando se encuentra un elemento menor (todos los elementos mayores han sido desplazados una posicin a la derecha). En este punto seinsertael elementok+1debiendo desplazarse los dems elementos.

Ejemplo de funcionamientoEn el siguiente ejemplo, 32 debe ser insertado entre 26 y 47, y por lo tanto 47, 59 y 96 deben ser desplazados.

k+111 26 47 59 96 32

11 26 47 59 96

11 26 32 47 59 96

En la implementacin computacional, el elementok+1va comparndose de atrs para adelante, detenindose con el primer elemento menor. Simultneamente se van haciendo los desplazamientos.

11 26 47 59 96 3211 26 47 59 96

11 26 47 59 96

11 26 47 59 96

11 26 32 47 59 96

Elalgoritmoenpseudocdigo(con listas que empiezan por 0) debera ser como el siguiente:

algoritmo insertSort( A : lista de elementos ordenables )

para i=1 hasta longitud(A) hacer index=A[i]

j=i-1

mientras j>=0 y A[j]>index hacer A[j+1] = A[j]

j = j - 1

fin mientras A[j+1] = index

fin parafin algoritmoAunque este algoritmo tiene un mejororden de complejidadque el deburbuja, es muy ineficiente al compararlo con otros algoritmos comoquicksort. Sin embargo, para listas relativamente pequeas el orden por insercin es una buena eleccin, no slo porque puede ser ms rpido para cantidades pequeas de elementos sino particularmente debido a su facilidad de programacin.

Javapublic static void insertSort (int[] v) { for (int i=1; i=0 && v[j]>aux; j--) v[j+1] = v[j]; v[j+1] = aux; } }3).Ordenamiento Shell

Elordenamiento Shell(Shell sorten ingls) es unalgoritmo de ordenamiento. El mtodo se denominaShellen honor de su inventorDonald Shell. Su implementacin original, requiereO(n2) comparaciones e intercambios en el peor caso. Un cambio menor presentado en el libro de V. Pratt produce una implementacin con un rendimiento de O(nlog2n) en el peor caso. Esto es mejor que las O(n2) comparaciones requeridas por algoritmos simples pero peor que el ptimo O(nlogn). Aunque es fcil desarrollar un sentido intuitivo de cmo funciona este algoritmo, es muy difcil analizar su tiempo de ejecucin.

El Shell sort es una generalizacin delordenamiento por insercin, teniendo en cuenta dos observaciones:

1. El ordenamiento por insercin es eficiente si la entrada est "casi ordenada".

2. El ordenamiento por insercin es ineficiente, en general, porque mueve los valores slo una posicin cada vez.

El algoritmo Shell sort mejora el ordenamiento por insercin comparando elementos separados por un espacio de varias posiciones. Esto permite que un elemento haga "pasos ms grandes" hacia su posicin esperada. Los pasos mltiples sobre los datos se hacen con tamaos de espacio cada vez ms pequeos. El ltimo paso del Shell sort es un simple ordenamiento por insercin, pero para entonces, ya est garantizado que los datos del vector estn casi ordenados.

EjemploConsidere un pequeo valor que est inicialmente almacenado en el final delvector. Usando un ordenamiento O(n2) como elordenamiento de burbujao elordenamiento por insercin, tomar aproximadamentencomparaciones e intercambios para mover este valor hacia el otro extremo del vector. El Shell sort primero mueve los valores usando tamaos de espacio gigantes, de manera que un valor pequeo se mover bastantes posiciones hacia su posicin final, con slo unas pocas comparaciones e intercambios.

Uno puede visualizar el algoritmo Shell sort de la siguiente manera: coloque la lista en una tabla y ordene las columnas (usando unordenamiento por insercin). Repita este proceso, cada vez con un nmero menor de columnas ms largas. Al final, la tabla tiene slo una columna. Mientras que transformar la lista en una tabla hace ms fcil visualizarlo, el algoritmo propiamente hace su ordenamiento en contexto (incrementando el ndice por el tamao de paso, esto es usandoi += tamao_de_pasoen vez dei++).

Por ejemplo, considere una lista de nmeros como[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ]. Si comenzamos con un tamao de paso de 5, podramos visualizar esto dividiendo la lista de nmeros en una tabla con 5 columnas. Esto quedara as:

13 14 94 33 82

25 59 94 65 23

45 27 73 25 39

10

Entonces ordenamos cada columna, lo que nos da

10 14 73 25 23

13 27 94 33 39

25 59 94 65 82

45

Cuando lo leemos de nuevo como una nica lista de nmeros, obtenemos[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]. Aqu, el 10 que estaba en el extremo final, se ha movido hasta el extremo inicial. Esta lista es entonces de nuevo ordenada usando un ordenamiento con un espacio de 3 posiciones, y despus un ordenamiento con un espacio de 1 posicin (ordenamiento por insercin simple).

El Shell sort lleva este nombre en honor a su inventor,Donald Shell, que lo public en 1959. Algunos libros de texto y referencias antiguas le llaman ordenacin "Shell-Metzner" por Marlene Metzner Norton, pero segn Metzner, "No tengo nada que ver con el algoritmo de ordenamiento, y mi nombre nunca debe adjuntarse a ste."[1][editar]Secuencia de espaciosLasecuencia de espacioses una parte integral del algoritmo Shell sort. Cualquier secuencia incremental funcionara siempre que el ltimo elemento sea 1. El algoritmo comienza realizando unordenamiento por insercin con espacio, siendo el espacio el primer nmero en la secuencia de espacios. Continua para realizar un ordenamiento por insercin con espacio para cada nmero en la secuencia, hasta que termina con un espacio de 1. Cuando el espacio es 1, el ordenamiento por insercin con espacio es simplemente unordenamiento por insercinordinario, garantizando que la lista final estar ordenada.

La secuencia de espacios que fue originalmente sugerida porDonald Shelldeba comenzar conN/ 2y dividir por la mitad el nmero hasta alcanzar 1. Aunque esta secuencia proporciona mejoras de rendimiento significativas sobre los algoritmos cuadrticos como elordenamiento por insercin, se puede cambiar ligeramente para disminuir ms el tiempo necesario medio y el del peor caso. El libro de texto de Weiss demuestra que esta secuencia permite un ordenamientoO(n2)del peor caso, si los datos estn inicialmente en el vector como (pequeo_1, grande_1, pequeo_2, grande_2, ...) - es decir, la mitad alta de los nmeros estn situados, de forma ordenada, en las posiciones con ndice par y la mitad baja de los nmeros estn situados de la misma manera en las posiciones con ndice impar.

Quizs la propiedad ms crucial del Shell sort es que los elementos permanecen k-ordenados incluso mientras el espacio disminuye. Se dice que un vector dividido en k subvectores esta k-ordenado si cada uno de esos subvectores esta ordenado en caso de considerarlo aislado. Por ejemplo, si una lista fue 5-ordenada y despus 3-ordenada, la lista est ahora no slo 3-ordenada, sino tanto 5-ordenada como 3-ordenada. Si esto no fuera cierto, el algoritmo deshara el trabajo que haba hecho en iteraciones previas, y no conseguira un tiempo de ejecucin tan bajo.

Dependiendo de la eleccin de la secuencia de espacios, Shell sort tiene un tiempo de ejecucin en el peor caso deO(n2)(usando los incrementos de Shell que comienzan con 1/2 del tamao del vector y se dividen por 2 cada vez),O(n3 / 2)(usando los incrementos de Hibbard de2k 1),O(n4 / 3)(usando los incrementos de Sedgewick de9(4i) 9(2i) + 1, o4i+ 1+ 3(2i) + 1), oO(nlog2n), y posiblemente mejores tiempos de ejecucin no comprobados. La existencia de una implementacinO(nlogn)en el peor caso del Shell sort permanece como una pregunta por resolver.

[editar]ImplementacionesEl Shell sort se usa comnmente enlenguajes de programacin; esto es una implementacin del algoritmo enC/C++para ordenar unvectorde enteros. La secuencia de incrementos usada en este ejemplo de cdigo da un tiempo de ejecucinO(n2) en el peor caso.

Javapublic static void shellSort(int[] a) { for ( int increment = a.length / 2; increment > 0; increment = (increment == 2 ? 1 : (int) Math.round(increment / 2.2))) { for (int i = increment; i < a.length; i++) { for (int j = i; j >= increment && a[j - increment] > a[j]; j -= increment) { int temp = a[j]; a[j] = a[j - increment]; a[j - increment] = temp; } } }}4). Quicksort

Elordenamiento rpido(quicksorteningls) es unalgoritmobasado en la tcnica dedivide y vencers, que permite, en promedio,ordenarnelementos en un tiempo proporcional anlogn.

Descripcin del algoritmoEl algoritmo consta de los siguientes pasos:

Elegir un elemento de la lista de elementos a ordenar, al que llamaremospivote.

Resituar los dems 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 implementacin deseada. En este momento, el pivote ocupa exactamente el lugar que le corresponder en la lista ordenada.

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.

Repetir este proceso de forma recursiva para cada sublista mientras stas contengan ms de un elemento. Una vez terminado este proceso todos los elementos estarn ordenados.

Como se puede suponer, la eficiencia del algoritmo depende de la posicin en la que termine el pivote elegido.

En el mejor caso, el pivote termina en el centro de la lista, dividindola en dos sublistas de igual tamao. En este caso, el orden de complejidad del algoritmo esO(nlog n).

En el peor caso, el pivote termina en un extremo de la lista. El orden de complejidad del algoritmo es entonces deO(n). El peor caso depender de la implementacin 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 delarray, y el array que le pasamos est ordenado, siempre va a generar a su izquierda un array vaco, lo que es ineficiente.

En el caso promedio, el orden esO(nlog n).

No es extrao, pues, que la mayora de optimizaciones que se aplican al algoritmo se centren en la eleccin delpivote.

[editar]DemostracinPodramos probar el orden de ejecucin en el mejor caso de la siguiente manera:

Vamos a suponer que el nmero total de elementos a ordenar es potencia de dos, es decir,n= 2k. de aqu podemos ver quek=log2(n), donde k es el nmero de divisiones que realizar el algoritmo.

En la primera fase del algoritmo habrn n comparaciones, en la segunda fase el algoritmo crear dos sublistas aproximadamente de tamao n/2. El nmero total de comparaciones de estas dos sublistas es: 2(n/2) = n. En la tercera fase el algoritmo procesar 4 sublistas ms, por tanto el nmero total de comparaciones en esta fase es 4(n/4) = n.

En conclusin, el nmero total de comparaciones que hace el algoritmo es:

n+n+n+ ..... +n=kn, dondek=log2(n), por tanto el tiempo de ejecucin del algoritmo en el mejor caso esO(n.log2n)[editar]Optimizacin del algoritmoCabe destacar que de usarse en su versin recursiva las siguientes optimizaciones y sus desventajas no se ven vistas en el tiempo de ejecucin del mismo mantenindose, as el tiempo de ejecucin planteado en un principio.

[editar]Tcnicas de eleccin del pivoteEl algoritmo bsico del metodo Quicksort consiste en tomar cualquier elemento de la lista al cual denominaremos como pivote, dependiendo de la particin en que se elija, el algoritmo ser ms o menos eficiente.

Tomar un elemento cualquiera como pivote tiene la ventaja de no requerir ningn clculo adicional, lo cual lo hace bastante rpido. Sin embargo, esta eleccin a ciegas siempre provoca que el algoritmo tenga un orden de O(n) para ciertas permutaciones de los elementos en la lista.

Otra opcin puede ser recorrer la lista para saber de antemanoqu elemento ocupar la posicin central de la lista, para elegirlo como pivote. Esto puede hacerse enO(n)y asegura que hasta en el peor de los casos, el algoritmo seaO(nlog n). No obstante, el clculo adicional rebaja bastante la eficiencia del algoritmo en el caso promedio.

La opcin a medio camino es tomartres elementos de la lista- por ejemplo, el primero, el segundo, y el ltimo - y compararlos, eligiendo el valor del medio como pivote.

[editar]Tcnicas de reposicionamientoUna idea preliminar para ubicar elpivoteen su posicin final sera contar la cantidad de elementos menores que l, y colocarlo un lugar ms arriba, moviendo luego todos esos elementos menores que l a su izquierda, para que pueda aplicarse la recursividad.

Existe, no obstante, un procedimiento mucho ms efectivo. Se utilizan dos ndices:i, al que llamaremosndice izquierdo, yj, al que llamaremosndice derecho. El algoritmo es el siguiente:

Recorrer la lista simultneamente con i y j: por la izquierda con i (desde el primer elemento), y por la derecha con j (desde el ltimo elemento).

Cuando lista[i] sea mayor que el pivote y lista[j] sea menor, se intercambian los elementos en esas posiciones.

Repetir esto hasta que se crucen los ndices.

El punto en que se cruzan los ndices es la posicin adecuada para colocar el pivote, porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores (o habran sido intercambiados).

[editar]Transicin a otro algoritmoComo se coment antes, el algoritmo quicksort ofrece un orden de ejecucinO(n)para ciertas permutaciones "crticas" de los elementos de la lista, que siempre surgen cuando se elige el pivote a ciegas. La permutacin concreta depende del pivote elegido, pero suele corresponder a secuencias ordenadas. Se tiene que la probabilidad de encontrarse con una de estas secuencias es inversamente proporcional a su tamao.

Los ltimos pases de quicksort son numerosos y ordenan cantidades pequea de elementos. Un porcentaje medianamente alto de ellos estarn dispuestos de una manera similar al peor caso del algoritmo, volviendo a ste ineficiente. Una solucin a este problema consiste en ordenar las secuencias pequeas usando otro algoritmo. Habitualmente se aplica elalgoritmo de insercinpara secuencias de tamao menores de 8-15 elementos.

Pese a que en secuencias largas de elementos la probabilidad de hallarse con una configuracin de elementos "crtica" es muy baja, esto no evita que sigan apareciendo (a veces, de manera intencionada). El algoritmointrosortes una extensin del algoritmo quicksort que resuelve este problema utilizandoheapsorten vez de quicksort cuando el nmero de recursiones excede al esperado.

Parmetros:

Se debe llamar a la funcin Quicksort desde donde quiera ejecutarse

sta llamar a colocar pivote para encontrar el valor del mismo

Se ejecutar el algoritmo Quicksort de forma recursiva a ambos lados del pivote

int colocar(int *v, int b, int t){ int i; int pivote, valor_pivote; int temp; pivote = b; valor_pivote = v[pivote]; for (i=b+1; i