You are on page 1of 108
2 J S ES Pay. 7 vz eS v4 ionen Programac + Android Studio ™ Buisqueda y ordenamiento Estructuras dinamicas Bases de datos - Programacion en Java @ Estructuras dinamicas - Bases de datos Android Studio - Bisqueda y ordenamiento Gaara Titulo: Proaramacion en Java IV / Autor: Carlos Arroyo Diaz Coordinador editorial: Miquel Lederkremer /Edicién: Claudio Peta Maquetado: Marina Mozzeti/ Coleccion: USERS ebooks - LPCUZ93 Copyright © MDX. Es una publcacién de Sic Esiciones. Hecho el depdsito que marca la ey 11723, Todas los derechos reservados. Esta publeacién no puede ser reproducida ion todo nien parte, por ningin medio actual futuro, sin el permiso previoy por escrito de Six Ediciones, ‘Su infracciin esta penada nor fas lees 11723, y 25446, La editorial no asume responsabilidad alguna por cualquier consecuencia derivad de le fabeicacién, funciosamienta y/o ullizecion e los servicios y productos que se descriven y/o analizan, Todas las marcas mencionadas 21 este foro son propiedad exciusiva de sus respectvos duets. Libro de edicién argentina weredusers com sxtoyo Dr, Cares Progyamacién on Java Estructura dinamicas, Bases de datos, Android studi, Lavequess yercenamiento / Carlos Koyo Dian. ‘La ed, -Cludad Autsnoma de Buenos Aas ‘Su Ediciones, 2019. Livro digital, POF-(Programacién an JAVA: 4) ‘renivo Digtal:ontine Ison 9re98r-a95e-47-4 4 Lengusjas de Programacsn. I Title. ccnp 005.4 Programacion en aVa Vol. IV ACERCA DE ESTE CURSO Jaya es uno defo lenguajes més robustos y populares en ls ‘actualidad, existe hace més de 20 aos y ha sabido dar os ‘irasadecuados para mantenexse vigente, Este curso de Programacién en Java nes ensena, desde cero, tad fo que necesitamos para aprender a programar y, mediante ejemplos prcticns, actividades y cuias paso a paso, nos presenta desde las naciones basicas de! sintaxisycodficacién en Java hasta conceptos avanzados como el acceso a bases de datos yla programacion para méui es. ACERCA DE ESTE VOLUMEN Eneste volumen se ensena el uso de las estructuras de datas, ‘dinamicas,elacceso a bases de datos y la programacion Java para Android. Be toute erie one > SOBRE EL AUTOR > RelSERS PREMIUM Cats ryo Diaz programa sito ‘ed SERS PREM la = especiaizad en tecnologiasy docente Se desempeia biblioteca digital de USERS = comopotesnrdehiomdtica General avayDesarolo Acedeas cents de | —— Web Tanbiéo ha tabajadocomo meordocereenel—pubieacines:Itrnes; | Ter ite dePemacie ears poets dlnsero eros Guia Rests, | —w eEdcin dela Guat Astnema deBuers Aes. uss doe coxteto et | —<——" ReqUSERS ara cualquier dsp, = Ennuesto stops emantr notice rlacinadesy paticpar ———Pabieares alms, sna |=. dela comunidad de teendgia mas imprtante de Ames Latina veda cata dias ea #8 Tea kal [O oc0} Técnicas de Marketing Digital RedUSERS PREMIUM Q Cientos de publicaciones USERS por una minima cuota mensual. eg Siempre, donde vayas. On Line - Off Line. En cualquier dispositivo. Q Incluye: eBooks - Informes USERS - Guias USERS - Revistas USERS y Power - CURSOS pe ee cS UKSfo7 1 [=] <9 Soren > Pee ero ACERCA DE ESTE CURSO Java es un lenguaje de programacion que sigue alianzandose como un estindar de la web y, por eso, aio tras afio, aparece en el tope de las Disquedas laborales de programadores. Es por esto que hemos creado este curso de Programacién en Java, donde encontrarén todo lo necesarto para iniclarse @ profundizar sus conocimientos en este lenguaje de programacion. EL curso esta organizado en cuatro volumenes, orlentades tanto a quien recién se inici: en este Lenguaje, como a quien ya estd involucrado y ‘enamorado de Java, En el primer volumen se realiza ung revisidn de las caracteristicas de este lenguaje, también se entregan las indicaciones para instalar €1enrorno de desarrollo y, postertormente, se analizan los elementos basicos de la sintaxis y el uso basico de las estructuras de control. Fn el segundo volumen se presentan las clases en Java, se realiza una Introduccién a los conceptos asociados a la Programacién Orientada a Objetos y también se profundiza en el uso de la herencia, colaboracién entre clases y 2olimorfismo. EI tercer volumen contiene informacién sobre el uso de las clases abstractas c interfaces, el manejo de excepciones y Ja recursividad. Finalmente, en el euarto volumen se ensefia el uso de las estructuras de datos dinamicas, el acceso a bases de datos y la programacién Java para Android Sabemos que aprender todo lo necesario para programar en Java en tan solo cuatro veliimenes es un tremendo desafio, pero conforme vamos. avanzendo, el camino se va allanande y las ideas se tomnan més claras {Suerte en el aprendizaje! SUMARIO DEL VOLUMEN IV 7 erseouccn Node / Listas / lia / Colas A.aorirvos be BusauEDs / 16 [Biisquerta Lineal / Busqueca Binaria Acanritvos De ORDENANIENTO / 25 Orcenamienta por selecrién / Ordenamiento par insercidin / Ordenamiento por Combinacian Anaotes / 36 QD Brs15 2¢ Datos 744 Conexion 4 una BBDD / 45 Establecer la canexidin a la base de dates / Crear el Objeto Statement / Ejecutar une sentencia SCL INSTALACION DE UN ScRviDoR oc BBD / 46 Instalar un Servidar de MySQL / Descargar el DriverJDBC para MySQL Conexion « MySQL / 56 Iwreanuccion at Munna Monite / 62 \Ventajas de usar y desarvollar para Andraic Avoroiw Stuoi / 63 Instalar Android Studio / Crear un Proyecto en Android Estructura BAsICA De un Proyecto / 71 Exploracin de un Proyecto / AndroidManifest Componentes de una apiicacién Android Activinanes BAsicas / 76 Ciclo de Vida / XML Ireraccion entre JAVA y Anorow / 79 Como usar el Archive R Primerns APPs / 82 Uso del emulador de Android Studio a acres. Datos Dinamicas En capitulos anteriores, trabajamos con estructuras de datos estaticas, como los arreglos; pero existe otro tipo de soluciones que resultan eficientes para el tratamiento de la informacion 0 la buena administracién de la memoria. En este capitulo explicaremos qué son las estructuras de datos dinamicas yveremos cémo utilizarlas. También entenderemos como funcionan los arboles en una estructura de biisqueda avanzada. 1. ESTRUCTURAS DE DATOS DINAMICOS we INTRODUCCION Trabajar con matrices y vectores a la manera de estructuras de datos es muy comin en programacién, pero existen escenarios en donde no es suficlente, por lo que se hace necesario utilizar estructuras dindmicas. Dentro de las estructuras estaticas sobresalen los arrays, en cambio, un vector, que proviene de Ja clase Veetor, representa al grupo de las estructuras dinamicas porque nos permite almacenar tantos elementos como queramos, siempre y cuando haya memoria disponible. En un vector podemos insertar o climinar elementos a favor 0 en detrimento de la memoria. Sin embargo, en el sentido estricto del concepto un vector no es una estructura de datos. La clase Vector encapsula y mantiene una estructura de datos interna para asf almacenar informacién, En definitiva, una estructura dindmica permite que almacenemos una cantidad variable de datos, los que pueden aumentar 0 decrecer en relacion directa con la memoria que ocupen. Este tipo de estructuras se generan encadenando unidades de informacion conocidas como nodos. Un conjunto de nodos enlazados entre si corresponden a una estructura dinamica, a esto hay que agregarle un conjunto de operaciones que estan asociadas, las que permiten manipular y acceder a los nodos y a su informacién, Nodo se trata de la unién de un dato més una referencia (o direccidn de memoria) a otro node El dato (o informacién) puede ser cualquier tipo de dato simple estructura de datos e, incluso, un objeto. La direccién al siguiente nodo €5 un puntero. La forma dec representar un node es la siguiente public class Nodo{ private 7 dat private Nodoct> ref; instrucciones, Maerters y setter ) 6 www redusers.com oe JAVA Vol.IV En una instancia del Nodo se puede almacenar una unidad de informacion y, desde luego, la direccion a otro nodo. Cuando tenemos una cantidad de este tipo de bloques, nos encontramos con las denominadas listas enlazadas. Dato Direccion al siguiente nodo Figura 1. £1 grafico os muestra la parte basice dela estructura de datos, un odo. Listas ‘Una lista es un conjunto de nodos, este cuenta con dos partes, los datos y el apuntador al siguiente nodo. El acceso a la lista siempre seré a partir del primer nodo, de tal Forma que hay que mantenerlo referenciado, En el caso de una lista enlazada, nos referimos a Ja estructura dinamica bésica que funciona como base para ottas estructuras No olvideros que las estructuras dindmicas se denen como un conjunto de nodos enlazados, sumados a un conjunto de operaciones entre las que podemos enuimerat:agregarAlFinal, agregarAlPrincip y liminar. Veamos un efemplo para entender cémo se implementan las istas y las operaciones: buscar Tipos de estructuras ‘Son e! soporte fundamental de un conjunto grande de algoritmos, y la eleccién de tuna estructura adecuada facilta enormemente Ia produccién ce programas. Muy por el contrario, la mala eleccién de una buena estructura de datos nos traera programas muy complejos. La capacidad que tienen este tipo de estructuras para incorporar 0 deshacerse de elementos a medida que sea necesario determinard el tivo de ellas que estamos usando: estaticas o dinamicas. www. redusers.com 7 1, ESTRUCTURAS DE DATOS DINAMICOS, (users) package estructurasdinamic: import java.util ArrayList; import Java.util.1ict; public class Listes { public static void main(String!) args) { Listesteing> paisesLista = new Arraybiatesteing> () paisesLista.add(~argentina”) ; paisestiste add (“Brasil”) : paisestista.add (“chile”); paisesTista.add ("Paraguay"); paisestista, add (“Uruguay”) + paisesLista.size(); patcesticta.get (0) > paisesLista.renove(0); paisesLista.renove ("Paraguay"); aystem.out.printin(*Los paises que asistieron son: + pa: ecticta); ' Como sabemas, las listas pueden guardar cualquier tipo de datos, aqui guardamos del tipo String, Luego, con e] método add, hemos agregado 5 valores. También es posible realizar algunas operaciones en nuesiro listado. > Para cbtener la cantidad de la lista usamos el método size paist nista.size()7 > Si queremos obtener un elemento especifico, usamos el método get ¥ como argumento colocamos el indice de la lista: paisestistaget (0): os JAVA Vol. IV > Para eliminar un elemento de la lista usamos remove Luego, si imprimimos la lista, éeberia darnos lo siguiente: Los paises que asistieron son (Brasil, Chile, Uruguay] > Para imprimir a los paises de una manera individual, podemos recurrir aun for for [int 1-0; i<-paisesiista.cize()-1; itt) ( System.out.printin (pa get ti) > Usamos un iterador para recorrer la lista ¢ imprimir todos sus valores, antes debemos importar para este caso” Amport java.utii. Tterator; Luego escribimos: iterator 1 = paisesiista.iterate:(); while (3. hachext ()) { syatem.ovt.printin(s.next()) > Para ellminar todos los elementos del listado debemos usar: paisesiiste. clea: () > Para saber si nuestro listado contiene algiin elemento paisesista. istmpty () Devolverd true o false swe ceduser. con 9 1. ESTRUCTURAS DE DATOS DINAMICOS oa > Para conocer si nuestra lista contiene, por ejemplo, el nombre de Brasil, utilizamos: pais suista contains ("Brasil"); Esto también nos devolverd un true o un false > Para modificar algiin dato ce nuestra lista, por ejemplo en el indice 2 que contiene el nombre de Chile, utilizamos el siguiente metodo: Paiseslista.set(2, "Bolivia’); Entonces con esto cambiamos Chile por Bolivia, > Para extraer una lista que contenga los nombres entre un indice y otro debemos utilizar: paisestista.subtict(0, 2); Si queremos imprimir el codigo anterior Systen.out.printin(paisesLista.sublist(0, 2)); El resultado sera (Argentina, Brasil) Notemos que se transforman los elementos desde el indice inicial (0) hasta el elemento anterlor al indice final @), despreciando el elemento que se encuentra en el indice final, por eso no da Argentina y Cl Dato | Ref | [Dato] Ref ] [Dato] Ref | [Dato] Ref 7 4 7 2 6 7 Raiz Figura 2. grafico nos muestra una lista enlazad, en la que podemos observar las nodos y sus referencias. 10 vwncresusers.com mo JAVA Vol. IV Pila Podemos decir que una pila o stack es una version restringida de una lista enlazada. Para entender un poco mas este concepto, debemos saber que las pilas utilizan una tecnologia UEPS, es decir, ultimo en entrar, primero en salir 0 en inglés LIFO (last in/first out). Como ejemplo podemos reproducir discos de musica y los varios colocando en forma apilada, de tal manera que el ultimo que colocamos es el primero que escucharemos. Por eso se dice que podemos agregar 0 tlisinar élemoentos salo dela parte superice’de Inia Exlsten varlas maneras de implementar una pla, ya sea através de un arreglo, que debe ser fijo; también por medio de un vector o simplemente creando una lista enlazada en donde cada elemento de la pila forma un nodo de la lista. ‘Aesto lo que Hamamos una representactén dindmlea y no existe limitacién en su tamaio, excepto la memoria. Una pila puede estar vacia (cero elementos) 0 Hema (en la representacion con un arteglo, si se ha llegado al ultimo elemento). St Infentamos extraer un elemento de una pila vacia, se praduciré una excepcién, debldo a que esa operacin no es postble; esta situacién se denomina desbordamiento negativo o underflow. Por el contrario, si intentamos poner un elemento en una pila llena, producira un efecto contrario de desbordamiento u overflow. wae | Too cma, Figura 3, Aqui ‘vemos ¢6mo opera basicamente una pila. vaww.redusers.com a 1. ESTRUCTURAS DE DATOS DINAMICOS ess Para insertar informacién en una pila, utilizaremos el método push y, para eliminar, el método pop. El método push se insertara al frente de la pila de tal forma que empujard todos los elementos, por eso utilizaremos este método cada vex que necesi encargado de extraer el elemento que necesitemos eliminar de la lista. mos insertar al inicio de la clase. En cambio pop sera el Veamos un ejemplo en el que implementaremos las operaciones bisicas, como insertar y extraer los datos de una pila de tipo entero import java.util stack: public class Principal { public static void main(String[] args) { Stack pila = new Stack(); EAbro 1 = new Libro("#i Quijote de 12 Mancha”, *Cer- vantes”) ; Libro 2 = new Libro("La Divina Comedia”, “oante”): Libro 3 = new Libro("acheth”, “shakespeare”): pila.push(1); // agrega un Libro a 1a pila pila.push (2); pile.push (3): System.out .println(pila-peek() .getTitalo(}); // el ultimo elexento adicionado while (Ipila.isimpty())( // muestra la pila completa Syotem.out. printin (pila.pop() .getTituio()); //extrae un elenento de 1a pila y R wuiyceedusers.com oon JAVA Vol.V Luego, una clase Hamada Litro que contendra los getter y setter de los atributos tanto de los titulos como de los autores: public class Libro { private String titulo private String autor; public Libro() { this.titule =~"; this.autor =“; public Libro(String titulo, String autor) { this.titule = titulo; this.autor = autor Public String getTitulo() ( return titulo: public void setritulo(string titulo) ( this. titule = titulo; public String getautor() ( return autor; public void setAutor (String autor} { this.autor = autor; wan edusers com B 1. ESTRUCTURAS DE DATOS DINAMICOS waaay Colas Las colas 0 queue son conocidas como estructuras FIFO (first-in/first- out, es decir, ‘primero en entrar’, ‘primero en salir’), debido al orden de insercién y de extraccién de elementos de la cola. Hay que destacar que tienen numerosas aplicaciones: colas ce mensajes, colas de impresion, colas de prioridades, eteétra, \Veamos un ejemplo en el que implementaremos este algoritme, En principio tenemos Ia clase Principal que contiene los elementos que van a producie la cola: import java.util PriorityQueue; import java,util.gneue; Public class Colas ( public static void main (String[] arge) ( QueuecPersona> cola=new PriorityQueuecersona>() cola.addinew Persona(*Juan Solis”, 1)); cola.add(new Persona(*Rosa Agrelo”, 3)); cola.add (new Persona(*Manuel Loiacono”, 2)) ; cola.add(new versona(~vedro Marat”, 1)) ; while (!cola.isBmpty()) { Pereona a = cola.remove(); System.out.printIn(a.getNonbre() + °° + a.gatTipo()) Luego tenemos la clase Persona, que contendra los getter y setter: Public clase versona implenents Conparable( private String nombre; private int tipo: // 1 normal, 2 tercera edad, 3 embarazada public Persona(String nombre, int tipe) { 4 wawtedusers.com a JAVA Vol. 1V thie nombre = nombre: this.tipo = tipar public String getNombre() ( return nombre; ' public void setNombre (string nombre) { this nombre = nombre: ' public int getTipo() { return tipo; } public void setripo(int tipo) ( this. tipo = tipo; Goverride public int comparemo (Persona 0) ( Af (tipo < o.getTipo()) ( rotura 1; ) else if (tipo > o.getTipet)) ( retura -1; } else ( return 0; Persona implementa de la interfaz Comparable, y también declaramos tipo, que implementa prioridades en las personas. a eedusers.con 6 1. ESTRUCTURAS DE DATOS DINAMICOS 16 ALGORITMOS DE BUSQUEDA Una bitsqueda de datos implica que vamos a determinar si un valor, al que llamaremos clave de bisqueda, se encuentra presente. En el caso de que sea positive, podremos también saber su ubicacién. Dentro de los algoritmos que se encuentran en este orden, encontramos la busqueda lineal simple y Ia busqueda binaria Busqueda lineal La busqueda lineal es la mas sencilla e intuitiva de implementar. E) algoritmo busca en forma secuiencial un elemento, evalia si este elemento es igual al primero, segundo, tercero, ¥ asi sucesivamente hasta compararse con el buscado: al encontrarlo devuelve el indice. Es un algoritmo de complejidad O(n). Como ejemplo tenemos ios siguientes valores en un arreglo 33 22 55 2.47 3 16 24.19 5 87 Creamos un programa que busque el ntimero 19, si usamos este algoritmo de busqueda, comprobara el! primer elemento del arreglo (33) y verificara st coincide con la clave de bisqueda. Si es de esta manera, vaa evaluar el siguiente elemento (22), y asi sucesivamente hasta encontrarlo; si estuviera e] elemento que estamos buscando, devolvera el indice 8. Sino hubiera coincidido (si hubiéramos puesto 29), el programa deberia devolvernos un valor centinela (por ejemplo, -1) Veamos un ejemplo en el que tendremos dos clases, una llamada ArregloLineal, que contendré un arreglo de enteros aleatorios, y otra clase BusquedaLineal gue buscara un elemento del arreglo. Veamos el cAdigo de Ta clase ArregloL ineat package estructurasdinamicas.Busquedas; import java.util Random; Amport java. util.Arrays ; public cla: ArregloLineal ( private intl] datos; ES JAVA Vol. 1V private static final Random generador = new Random() ; public Arreglotineal (int tama‘io) ( datos = new int[tamasio] ; for (int 4-0;i Consideramos la lista completa como segmento inicial de busqueda Analizamos el punto medio del segmento (el valor central); si es el valor buscadio, devolvemos el indice del punto medio. > Siel valor central es mayor al buscado, podemos descartar el segmento que esta desde el punto medio hacia la derecha. En caso de que el valor central sea menor al buscado, descartamos el segmento que esta desde el punto medio hacia la izquierda. > Una vez descartado el segmento que no nos interesa, volveros a analizar el segmento restante de la misma forma, > Sien algin momento cl segmento por analizar tiene longitud 0 0 negativa, significa que el valor buscado no se encuentra en la lista. 20 wiv. redusers.com JAVA Vol. IV Para sefialar la porcién del segmento que se est analizando a cada paso, utilizamas dos variables (iq y der) que contienen la posicién de inicio y la posicion de fin del segmento que se esta considerando. De la misma manera, usaremos la varlable medio para contener la posicion del punto medio del segmento. En el ejemplo, verificamos que el nimero 18 no se encuentra en la lista, por lo tanto, dara -1 Si comparamos con el algoritmo de busqueda lineal, notaremos que este hubiera requerido varias comparaciones més. Ahora veamos un ejemplo en 1 que verificamos la implementacion de este algoritmo en Java, Primero lo analizaremos desmenuzando el codigo de la clas ArregloBinario, En la primera parte, se han importado las clase Random {como en el ejemplo anterior! y la clase Arrays. Se crea un objeto generador de 1a clase Random. Luego se crea un arreglo de un tamahio dado, que s¢ llena con enteros aleatorios. Asimismo, se crea espacio para el arreglo con datos, que se [lenara con enteros aleatorios en el rango 10 a 99, gracias al for. Finalmente, e] método sort producira el ordenamiento del array: package estructurasdinamicas.Binarias; /** author Charlyred ” import java.util.Randon: import java.util arrays: public class ArregioBinario( private int{] datos; private static final Random generador = new Randon() ; public ArrogioBinario(int tamaso) ( datoe = new int[tamatiol ; for { int i=0;i); syatem.out.printin( © °); StringBuilder y StringBuffer Java prove soporte especial para la concatenacion de strings con las clases ‘StringBuildor y StringBuffer. Un objeto StringBuilder es una secuencia de caracteres ‘mutable; su contenido y su capacidad pueden cambiar en cualquier momento. Ademnas, a diferencia de los strings, los builders cuentan con una capacidad, la cantidad de cespacios de caractores asignados, Esta es siemipre mayor 0 igual que la longitud y se expande automaticamente para acomodarse a mas caracteres. 2 www redusers.com mo JAVA Vol.1V Af (elenentoBusqueda—datos [medio]) ubicacion=nedio; else if (elementoBasqueda int enteroasuscar; int posicion; Creamas el arreglo que se mostraré en pantalla ArregloBinario arragicBuequeda = new ArregloBinario(15) System. out printin(arregloBusqueda) ; Systen.out print ("Escriba un valor entero (-1 para salir): "); ‘enteroABuscar = entrada.nextint (); System. out.printla(); Con un while recibiré una entrada repetida y usara la busqueda binaria para tratar de encontrar el entero: while(enteroABuscar '= -1( posicion=arregloBusqueda. busquedaBinaria(enteroABuscar) ; Mediante una secuencia if, tendremos un valor de retorno 1), que nos indicara que no se encontr@ el entero: 24 \wwrosusers.com oes JAVA Vol. IV if (posicion==-1) System. out.printin("El entero " + enteroABuscar +" no se encontré.\n”) ; else System. out.printin(“El entero ~ + enteroasuscar + ~ se encontré en la posicién “ + posicion + *.\n"); syeten.out print ("Escriba un valor entero (-1 para salir): °) enteroABuscar = entrada.nextint(); system. out.printin(); 2Como se mide la eficiencia de este algoritmo? Como siempre nos ubicamos en el peor de los casos: el proceso de biisqueda en un arreglo ordenado de mas de mil elementos va a requerir solo 10 comparaciones, puesto que dividiremos este numero por 2 y asi de forma consecutiva, y despues de cada comparacion eliminamos la mitad que no necesitamos. De alli el nombre de basqueda binaria. TF] maximo nimero de comparaciones necesarias para la busqueda binaria es el exponente de la primera potencia de 2 mayor que el niimero de elementos en el arreglo y se representa como log2n Por eso a este algoritmo también se le conoce como tiempo de ejecucién logaritmico. ALGORITMOS DE ORDENAMIENTO El ordenamiento de datos responde a un factor espectfico de orden, como ascendente 0 descendente y corresponde a una de las, caracteristicas mas usadas en la computacion Podemos citar cientos de ejemplos por la que usamos en distintas Areas el ordenamiento: los alumnos de un colegio por orden alfabético. los equipos de fiitbol de acuerdo a los puntajes obtenidos (de mayor a menor) en un campeonato; los participantes de una carrera de 100 mettos planos por el tiempo lograco, de menor a mayor, etcétera, wonwedusers.cont 3 1 ESTRUCTURAS DE DATOS DINAMICOS oo Un panto importante es que el resultado final (los datos ordenados) sera el mismo, no importa qué algoritmo hayamos uti es que debemos construir un algoritmo que sea capaz de realizarlo en el menor tiempo posible (cosa parecida a los algoritmos de biisqueda) Y un uso efectivo de la memoria. Trataremos tres tipos de algoritmas: por seleccin, por insercién y por combinacién Los ¢os primeros se caracterizan por ser simples de programar, pero ala vez ineficientes. El iltimo es mas dificil de programar, pero mas rapido en entregar os resultados. ado. El tema Ordenamiento por selecci6n Este se convierte en un tipo de ordenamiento simple, pero como ya hemos dicho, resulta inefictente Funciona de manera iterativa: la primera vez selecciona el elemento mas pequefo del arreglo y lo intercambia con el primer elemento. Luego, en la segunda, teracinelige el elemento més pequeio de los restantes y lo intereambia con el segundo elemento. Esta tarea continia de tal forma que, en la dima iteracion, se selecciona el segundo elemento mas grande y lo intercambia con el indice del segundo al ultimo, en consecuencia, deja el elemento mas grande en el ultimo indice. Supangamos que tenemos los siguientes elementos de una lista 23-44 9954 12 63 14 8, Un programa que intente ordenarlos bajo este algoritmo deberia determinar el elemento més pequefio (8) que esté en el indice 7, entonces el programs intercambia el 8 por el 23 (de indice 0), con lo que quedaria: 8 44.9954 12 63 14 23 Luego cl programa determina cual es el valor més pequefo, pero esta vez solo compara los valores restantes (no incluye el 8), en este caso tenemos el 12 al que intercambia por el siguiente de la lista de indice 1, es decir el 44; asi la lista quedaria de la siguiente forma: 8 12 9954 44 63 14 23 2 wor redusers.com JAVA Vol. IV Si entendemos la forma cémo funciona este algoritmo, esto deberfa seguir 8 12 1454 44 63 99 23 8 12 1423 44 63 99 54 8 12 1423 44 54 99 63 8 12 1423 44 54 63 99 Y asi ya tenemos ordenado nuestro arreglo. ‘Veamos cémo podemos implementar este tipo de ordenamiento en Java, anlicemos la clase OrdenamientoSeleccion: package Ordenamiento.porSeleccion; /**Qauthor CharlyRed 4 import java.util. Arrays; import java-util.Random; public class OrdenamientoSeleccion{ private int{] datos; // arreglo de valores private static final Random generador = new Rancom(); Fste método crearé un arreglo con un tamafio determinado para luego Ilenarlo con enteros aleatorios: public OrdenamientoSeleccion(int tamaiio) { datos = new int[tamano] ; for (int 120; ictamano; 4++) datos [i]=10+generador.nextint (90) ; E] método ordenar empieza a hacer este tipo de ordenamiento. Creamos un indice para el elemento mas pequefo. Luego, dentro del for, iteraremos a través de datos.length -1 elementos. Después, por medio de otro for, itera para buscar el indice del elemento mas pequefio: wuwredusers.com ar 1. ESTRUCTURAS DE DATOS DINAMICOS vas public void ordenar()( int masPequerto; for(int i=0; icdatos length-1; i++) ( masPoquenio=i; // primer indice del resto del arreglo for (int indicesit1;indice); for (int izindice+1; icdatos.length; i++) System.out.print(datos[ i] + ~* “); System.out.print ("\a aH for(int 3 = 0; j < pagada; +4) System.out.print(*-- “); system.out.printla( “\n”); —} Ahora veremos los codigos de la clase TestOrdenamientoSeleccion. Primero creamos un objeto que realizaré e] ordenamiento y respeta la siguiente logica (verificar los comentarios): Public class PruebaOrdenamientoSeleccion{ public static void main( String[} args )( OrdenamientoSeleccion erregloOrden = new OrdenamientoSelec~ ion (10) ‘System.out.printin(“arreglo desordenado: System.out.printin(arregloOrden + “\n"); //imprine arreglo des- ordensdo arregloorden. ordenar(); //ordena el arreglo System, out. printin("Arreglo ordenado;”) ; system. out. printin(arregloOrden) ; //imprine el arreglo ordenado Para terminar, este iltimo método nos imprimira los valores del arreglo: Override public String toString|) { xeturn Arrays.toString(datos) : En cuanto a la eficiencia del ordenamiento por seleccion, este se ejecuta en un tiempo igual a O(n2). wwr.redusers.com 29 1. ESTRUCTURAS DE DATOS DINAMICOS [secs] 30 Ordenamiento por insercion F ordenamiento por inserciéa es oit0 algoritmo de ordenamiento simple, pero ineficiente. En la primera iteracién de este algoritmo, se toma e segundo elemento en el aregloy, st es menor que el primero, se intercambian. En la segunda iteracton, se analiza el tercer elemento ¥ se isertaen I posiciin correcta con respecto a los primeros dos elementos, de manera que los tres esten ordenatdos. En la -ésima iteracton de este algoritm, los primeros i elementos en el arreglo original estar ordenadas. Para que veamos la efciencia de este tipo de ovdenamiento, tlizaremos la misma serie ue usamos para el ejemplo anterior: 23 44 9954 12 63 148 Un programa que implemente el algoritmo de ordenamiento por insercién analizara al principio los primeros dos elementos del arreglo, 23 y 44. Como estos ya se encuentran ordenados, el programa continda; en caso contrarto, e] programa los intercambiaria, [En a siguiente iteracion, el programa analiza el tercer valor, 99. [ste valor es mayor que 44, por Io que el programa continga. EL siguiente niimero es 84; este, al ser menor que 99, se intercambia y se inserta antes que él. Luego compara con el 44, pero, al ser mayor que 1, ya no sigue con el intercambio. Tenemos: 23 44 5499 12 63 14.8 Ahora viene el nlimero 12, al que comparamos con el 99. Al ser ‘menor, se intercambia con el 99 y sigue comparando; al ser menor que el 54, se coloca a su tzqulerda, Iuego en 44, sucede lo mismo y,finalmente, se compara con el 23,y también se intercambia. Esto quedaria 12 23 44 5499 63 14 8 Este mismo comportamiento lo vamos continuar hasta terminar con el ordenamiento, EL algoritmo de ordenamiento por insercién también se ejecuta en un tiempo igual a O(n2), al igual que el ordenamiento por seleccién. vnuw.redusers.con oes JAVA Vol. 1V Ordenamiento por combinacién El ordenamiento por combinacién es un algoritmo de ordenamiento eficiente, pero resulta mas complejo que sus predecesores. La forma en que funciona este algoritino lo va divicir en dos subarregios de igual tamafio, ordena cada subarreglo y después los combina en un arreglo mas grande. Con un namero par de elementos, el algoritmo crea los dos subarreglos de tal forma que uno tenga més elementos que el otro. La implementacion del ordenamiento por combinacién en este ejemplo es recursiva, Fl caso base es un arreglo con un elemento que, desde luego, esta ordenado, por lo que el ordenamiento por combinacién regresa de inmediato en este caso. El paso recursive divide el arreglo en dos piezas de un tamafio aproximadamente igual, las ordena en forma recursiva y, después, combina los dos arreglos ordenados en un arreglo ordenado de mayor tamafio. Supongamos que tenemos el algoritmo que ya ha combinado arreglos mas pequefios para crear los arreglos ordenados A:23 44.5499 y BB 12 14 63 E] ordenamiento por combinacién com! arregio ordenado de mayor tamano El elemento mas pequefio en A es 23 (que se encuentra en el indice cero de A). El elemento mas pequefio en Bes 8 (que s a estos dos arreglos en un e encuentra en el indice cero de B), Para poder determiner el elemento mas pequefio en el arreglo mas grande, el algoritmo compara 4 y 5. El valor de B es mas pequefto, por lo que el B se convierte en el primer elemento del arreglo combinado. £1 algoritmo continia y compare 44 (el segundo elemento en A) con 8 {el primer elemento en B). El valor de B es mas pequefio, por lo que 8 se convierte en el segundo elemento del arreglo mas grande. El algoritmo contimia comparando 44 con 12, en donde 12 se convierte en el tercer elemento del arreglo, y asi sucesivamente Ahora implementaremos un cédigo para Java asi veremos la forma de trabajar este algoritmo. Siguiendo la misma forma de trabajar los algoritmos anteriores crearemos dos clases, una de ellas creara un array aleatorio de 10 a 99. Sera la clase OrdenamientoCombinacion, cuyo cédigo es: wurw.redusers.com a1 1, ESTRUCTURAS DE DATOS DINAMICOS ee package ordenanientocombinacion; Amport. Java util Random; public class Ordenamientocombinacion( private int[] datos; // arreglo de valores private static Random generador = new Random(); Este método crea un arreglo de un tamafo dado y Io lena con enteros aleatorios: public OrdenamientoCombinacion (int tanafio) ( datos=new int [tamafo] ; for(int is0; ictamatlo; i++) datos[i]=10 + generador.nextint (90) ; Este métoda llama al método de divisién recursiva para comenzar el ordenamiento por combinacion, de tal forma que va a dividir todo el arreglo’ public void ordener(]{ ordonarArraglo(0, datos.length - 1); Este método divide el arreglo, ordena los subarreglos y los combina en un arreglo ordenado. Luego evaluaré el caso base si el tamaiio del arreglo es igual a1 ¢ imprime el paso de la division En ordenarArreglo divide el arreglo ala mitad, luego ordena cada mitad a través de Hamadas recursivas: private void ordenarArreglo(int inferior, int superior) { 4f((euperior - inferior)>=1){ // si no int medic! dio del arreglo el caso base inferior + superior)/2; //calcula el elemento ne- Ant medic? = mediol + 1; //calcula el siguiente elemento ar- riba System.out.printin( “division: “ + suberreglo(inferior, 32 wneredusers.com JAVA Vol.IV superior); System. out.printin( * > + subarreglo(inferior, nediol) ); syatem. out.printin( > + subarreglo(medioz, su- perior)); System. out.printin() ; ordenarArreglo(inferior, mediol); // primera mitad del arreglo ordenarArreglo(medic2, superior); // segunda mitad del arreglo combinar (inferior mediol,medio2, euperior) ; } Este método combina dos subarreglos ordenados en un subarreglo ordenado. Luego se imprimen en pantalla los dos subarreglos antes de combinarlos. Por medio de un while se combinan los arreglos hasta Hegar al final de uno de ellos private void combinar(int izquierdo, int madiol, int medioz, int derecho) { int indicetzg = izquierdo; //indice en sub arreglo izquierdo int indiceDer = medio; //indice en sub arreglo derecho int indiceCombinado = izquierdo; //indice en arreglo de tra~ bajo temporal int[] combinado = new int (datos.length]: // arreglo de trabajo system.out.printin("conbinacion:” + subarreglo(izquierdo, me- diol) ; System.out.printin(* * + subarreglo(medio2, derecho) ); while (indicetzq<-mediol ssindiceber<=derecho) { Lf (datos {indi ceTzq] <=datos [indiceber]) combinade indiceCombinadot+]=datos [indiceTzqtt] ; else ‘combinado {indiceConbinedo+ +] =datos [indi ceD ext]; wwro.cedusers.com 3 1. ESTRUCTURAS DE DATOS DINAMICOS ES U1 #1 eh azzeglo tzquierdo esta vacto Af (indicerzq==medio2) // copia el resto del arroglo derecho while indiceDer <= derecho) combinado[indiceConb Anadot+)=dates [indiceber++] ; else // el arraglo derecho esta vacio // copia el recto del arroglo izquierdo while (indicetzqéamediol) combinado [indiceConbina dott] =datos[indicerza++] for(int dmizquierdo; icederecho; i++) datos [i] = combinado[4] 1/ imprioe en pantalla el arreglo combinado system. out.printin(* > + subarreglo (izquierdo, erecho)) ; systen.out.printin() El for copia los valores de vuelta al arreglo original, EL siguiente método imprime en pantalla ciertos valores en el arreglo: public String subsrreglo(int inferior, int superior) ( StringBuilder temporal = new Stringsuilder() + // Amprime en pantalla espacics para 1a alineacién for (int 1=0; icinferier; i++) temporal .append(* ~); // impzine en pantalla 1 resto de los elementos en el arre- gio for(int isinferio scesuperior: it+) tomporal.append(" ~ + datostil): return temporal. toString(); 4 wom reusers.com fincas] JAVA Vol. IV Para terminar, este método imprime los valores en el arreglo public String toString() { return subarreglo(), datos.length - 1); Y, ahora, el cédigo ce la clase que ejecutara el ordenamiento package ordenamientoconbinacion; public class PruebaOrdenamientoCombinacion( Public static void main(string[] args) ( OxdenamientoConbinacion arregloOrden=new Ordenamien— toConbinacion (10) + // imprime el arreglo desordenado System. out. printin("Desordenado:” + arregloOrden + wa): arregloOrden.ordenar(); //ordena e1 arreglo //imprime el arreglo ordenado System. out.printin("Ordenado: | “tarregloOrden) ; Corsideremos la primera llamada (no recursiva) al método ordenarArreglo. Esto produce dos lamadas recursivas al método ordenarArreglo con subarreglos; cada uno de ellos tiene un tamaiio aproximado de la mitad del arreglo original y una sola llamada al método combinar. Esta Hamada a combinar requiere ml comparaciones para llenar el arreglo original, que es O(n), Recordemos que se puede elegir cada elemento en el arreglo mediante la comparacion de un elemento de cada uno de los subarreglos. Las dos llamadas al método ordenarArregla producen cuatro Hamadas recursivas mas al método ordenarArreglo, cacla, una con un subarreglo ce un tamafio aproximado a una cuarta parte del tamaiio del arreglo original, junto con dos lamadas al método combina. Estas dos llamadas al método combinar requieren, 2-1 comparaciones Para un néimero total de O(n) comparaciones, wowsredusers.com 35 1. ESTRUCTURAS DE DATOS DINAMICOS oa Este proceso continia, y cada llamada a ordenarArreglo genera dos llamadas adicionales a ordenarArregto y una llamada a combinar, hasta que el algoritmo divide el arreglo en subarreglos de un elemento. En cada nivel, se requieren O(a) comparaciones para combinar los subarreglos. Cada nivel divide el tamano de los arreglos a la mitad, por lo que al duplicar el tamano del arreglo se requiere un nivel mas. Si se ‘cuadruplica el tematio del arregto, se requieren dos niveles mas. Este patron es logaritmico, y produce log2 n niveles. Esto resulta en una eficiencia total de O(n Tog n). ARBOLES En una estructura de datos, los arboles binarios o tree set son elementos que apuntan a un lado izquierdo o derecho, puesto que no pueden apuntar a mas de dos nodos, Su objetivo principal es efectuar grandes basquedas, por la facilidad del recorrido, ya que lo realiza por nodo en vez de hacerlo de forma lineal como vimos antes. Existen varias técnicas para hacer el recorrido a través de un arbol, entre ellas Ja de pre orden, post orden ¢ in orden, de busqueda mostrara los distntos métodos para hacer recorridos. > Recorrido pre orden este recorre el nodo raiz, luego pasa hacia el nodo izquierdo y, al final, el nodo derecho. Segiin el esquema de la Figura 5 el recorrido deberia ser 10-5-3-7-12-11-15 36 wir rodusers.com

You might also like