Está en la página 1de 25

1. ESTRUCTURA DE DATOS BSICAS 1.1.

Cadenas o Strings Cadena: Es una secuencia finita de smbolos tomados como un conjunto de caracteres (letras, nmeros, caracteres especiales). Strings: Internamente es un arreglo de caracteres, dependiendo del lenguaje de Programacin generalmente se considera el inicio de la cadena en la posicin 0. La importancia del String radica en que la mayor parte de la informacin que se maneja actualmente en casi cualquier rea del conocimiento puede verse como una secuencia de caracteres. TDA: String Elementos: Conjunto de letras maysculas y minsculas, caracteres especiales y dgitos. Estructura: Existe una relacin lineal, debido a que se considera como una cadena de caracteres. Dominio: Suponiendo que los Strings pueden almacenar entre 0 y 80 caracteres, su dominio ser el conjunto de todas las cadenas que puedan formar con la combinacin de elementos de esa longitud. Operaciones: - I_ICIALIZAR Utilidad: Nos sirve para definir el espacio a ocupar en la memoria por el string. Datos de entrada: Tamao de memoria para el String Datos de salida: El string S es nulo (esta vacio) Precondicin: Ninguna Postcondicin: el String S es nulo. - I_SERTAR_CARCTER_AL_FI_AL Utilidad: aadir un carcter al final Datos de entrada: String S y la letra L que se insertar al final de S. Datos de salida: String S modificado Precondicin: El numero de letras en S es menor que 80. Postcondicin: el string S tiene una letra ms en el extremo derecho - BORRAR_ CARCTER_I_ICIAL - Utilidad: Permite borrar un carcter al inicio del String - Datos de entrada: String S al que se le borrara la primera letra - Datos de salida: String S modificado - Precondicin: el String S exista y no sea nulo - Postcondicion: el String S tiene una letra menos en el extremo izquierdo Curso de Estructuras de Datos Orientada a Objetos 2 - CO_CATE_AR Utilidad: Unir dos Strings S1 y S2 Datos de entrada: Strings S1 y S2. Datos de salida: String S1 modificado. Precondicin: La suma de la longitud de S1 y S2 debe ser menor que 80. Postcondicin: A string S1 se le agrega todos los caracteres de s2(en el extremo derecho); s2 no se modifica. - BUSCAR_SUBSTRI_G Utilidad: Buscar un Substring S2 en S1 Datos de entrada: Strings S1 y S2. Datos de salida: verdadero si S2 est contenida en S1, falso en caso contrario Precondicin: S1 y S2 existan

Postcondicin: ninguna - OBTE_ER_ CARACTER Utilidad: Sirve para encontrar un carcter dentro del String Datos de entrada: String S donde se desea conocer cierto carcter y la posicin i del carcter que se desea conocer. Datos de salida: Carcter que se encuentra en la posicin i del String S Precondicin: El String S no sea nulo e i debe ser un valor entre 1 y la longitud de S Postcondicin: Ninguna - VERIFICA_VACIO Utilidad: Sirve para verificar si una cadena o String est vaca o no Datos de entrada: String S que ser verificado Datos de salida: Verdadero si el String S no tiene caracteres y Falso en caso contrario. Precondicin: Ninguna. Postcondicin: Ninguna. - VERIFICAR_LLE_A Utilidad: Sirve para verificar si una cadena est llena o no Datos de entrada: String S que ser verificado Datos de salida: Verdadero si la cadena o String S contiene 80 caracteres y Falso en caso contrario Precondicin: Ninguna Postcondicin: Ninguna - I_VIERTE Utilidad: Sirve para invertir el orden de los caracteres de un String. Datos de entrada: String S1 a invertir Datos de salida: String S2 Precondicin: la secuencia de la cadena S se invierte, de forma que el primer carcter toma el lugar del ltimo, el segundo del penltimo y as sucesivamente. Postcondicin: El String S1 cambia sus caracteres y se convierte en String S2 Representacin del TDA String. Se puede almacenar en la memoria mediante almacenamiento contiguo y tambin podr utilizarse el almacenamiento no contiguo. 1. Uso de un Carcter Centinela Los caracteres se almacenan en un arreglo con longitud predefinida. Se delimitan por un carcter especial, denominado Centinela -equivale a un carcter nulo en la mayora de los lenguajes de programacin \0 . M A R T E S \0 012345 ...n Desventaja. _ El carcter centinela ocupar un espacio dentro del String. _ No se conoce la longitud del String por lo que se debera programar un mtodo que permita realizar dicha operacin. Los lenguajes de programacin que utilizan este tipo de almacenamiento son: C Y C++. 2. Almacenamiento de la longitud del String Los elementos del String se almacenan en un arreglo de longitud predefinida. La Longitud actual del String se almacenan en la posicin 0 y no forma parte del String. max ASCII6 M A R T E S .. ..

0123456N Desventaja. Debido a que la longitud ocupa una posicin de un carcter la longitud se restringe a 265. El lenguaje de programacin que utiliza este tipo de almacenamiento es el Pascal 1. Lista encadenada de nodos con un caracter Genera una lista encadenada donde cada nodo almacena un solo carcter y la direccin del siguiente nodo de la lista. Ventaja. Puede generar Strings de longitud infinita. Desventaja. Desperdicio del 80% en la memoria debido al almacenamiento en tantas direcciones de nodos. 2. Lista encadenada de nodos con N caracteres Genera una lista encadenada donde cada uno de los nodos almacena N caracteres, del String (N>1) y la direccin donde se encuentra el siguiente nodo. Ventajas. Genera Strings de longitud infinita y se disminuye el desperdicio de memoria. Desventajas. La implementacin de sus operaciones es ms compleja, ya que la informacin contenida en el String est almacenada en forma de substrings. Qu es un arreglo Unidimensional? Es un tipo de datos estructurados, est formado por una coleccin finita y ordenada de datos del mismo tipo. Adems de conoce como una estructura natural, que es utilizada para modelar lista de elementos iguales, donde el tipo de acceso es DIRECTO debido al uso de un ndice que indica la posicin relativa del elemento dentro de la Estructura de Datos y adems porque para acceder a cada elemento se lo hace directamente sin tener que consultar elementos anteriores o posteriores. Representacin en memoria. 100 A[0] 101 A[1] 102 A[2] 103 A[3] 104 A[4] TDA: ARREGLO. Elementos: Nmeros enteros. Estructura: Lineal entre los elementos del arreglo. Dominio: Los datos o elementos posibles a guardar estarn en el rango de 0-20 nmeros. Operaciones: - OBTE_ER_ELEME_TO. Utilidad: Regresa el elemento del arreglo A, que tiene un rango r. Datos Entrada: ndice i 100 A[0] 101 A[1] 102 A[2] 103 A[3] 104 A[4] .

. . . Analiza: Se tienen las notas de un grupo de 90 estudiantes y necesitamos saber cuntos de estos estudiantes tienen tienen una nota superior al promedio del grupo. Cmo podramos resolver este problema?.... Piensa en varias soluciones, comenta con tus compaeros y con tu profesora ..!!! Curso de Estructuras de Datos Orientada a Objetos 6 Datos Salida: elemento e Precondiciones: elemento e, este guardado dentro del arreglo A. ndice i sea < rango. Postcondiciones: se produce una condicin de error si el ndice i<0 o si i > N-1, donde n es la cantidad actual de elementos. - AGREGAR _ ELEME_TO. (ESCRIBIR) Utilidad: Colocar un elemento e, en el arreglo A del rango r. Datos Entrada: ndice i, el elemento nuevo e } Datos Salida: El arreglo A con un elemento mas Precondiciones: ndice i<N Postcondiciones: Se produce una condicin de error si el ndice i<0 o si i > N-1, donde n es la cantidad actual de elementos. - ELIMI_AR_ELEME_TO. Utilidad: Sustituir el elemento e del arreglo A de rango r en el ndice i. Datos Entrada: elemento e, el ndice i Datos Salida: el elemento anterior Precondiciones: ndice i<rango. Pos condiciones: Se produce una condicin de error si el ndice i<0 o si i > N-1, donde n es la cantidad actual de elementos. Manejo de arreglos. Los arreglos son considerados como objetos cuyo tamao se determina en tiempo de compilacin y no puede ser modificado en tiempo de compilacin. Pueden contener. Tipos de datos (int, char, boolean, float) Objetos de clases (los del API, o los definidos por el usuario). Se hace uso del operador [ ]. Dispone de una funcin miembro para consultar la longitud de arreglo length. Declaracin de un arreglo. <tipo dato/clase> [ ] identificador; <tipo_dato/clase> identificador [ ]; Curso de Estructuras de Datos Orientada a Objetos 7 Ejemplos: String [ ] das_Semana; int [ ] edades_Estudiantes; double [ ] notas; char [ ] vocales; boolean [ ] productos disponibles.

Creacin de los arreglos. Reservar el espacio en memoria y se requiere de un constructor que es el operador (new). Ejemplos: Crear un arreglo vacio. String [ ] das_Semana=new String [7]; Crear con valores inciales. Int [ ] edades_Estudiantes={15,20,23,18}; Errores. 1. Crear arreglos estticos en tiempo de compilacin. int [4]edades; 2. Asignar valor a un arreglo sin haber determinado su tamao. int [ ] edades; edades [0]=15; Principales Operaciones 1. Ver informacin. Saber el contenido o el valor del arreglo de una determinada posicin. Ejemplo. int [4] edades={15,18,20,25}; edades Sintaxis: Nombre_Arreglo[subindice]; Edades[3]; retorna el 25 ya que est en la posicin 3. 2. Actualizar un arreglo. Sintaxis: Nombre_Arreglo[subndice]= valor ; Edades [1]=28; Ejemplo de actualizacin de la posicin 1. 3. Presentacin de los arreglos. Se lo hace a travs de un recorrido. for(int i<0;i<edades.length;i++){ System.out.println(edades [i]); } Java utiliza los siguientes api: Vector, Collection, Array que son clases y/o interfaces que permiten almacenar cualquier clase de objetos como elementos y que pueden ser usados independientemente como unidimensionales o multidimensionales. 1.2.2. Arreglos Bidimensionales (Matrices) Qu es un arreglo bidimensional? Un arreglo bidimensional es un conjunto de datos homogneos finito y ordenado donde se hace referencia a cada elemento por medio de dos ndices: rengln (fila) y columna. Arreglos bidimensionales ms conocidos como matrices (mxn), donde m representa a las filas y n a las columnas. Tambin conocidos como arreglos de arreglos, su manipulacin es similar a los arreglos unidimensionales sin acceso directo la nica variacin es que se requiere tantos ndices como dimensiones se tengan. Para calcular el nmero de elementos que estn en la Matriz se realiza la siguiente operacin: ne=n elementos1* n elementos2* n elementos n. ne=m*n ne=3*2 ne=6. Representacin de una matriz MATRIZ COLUM/AS FILAS

0 1 2 .. / 0 P(0,0) P(0,1) P(0,2) p(0,N-1) 1 P(1,0) P(1,1) P(1,2) p(1,N-1) 2 P(2,0) P(2,1) P(2,2) p(2,N-1) M P(M,0) P(M,1) P(M,2) p(M-A,N-1) Manejos de Arreglos Bidimensionales (Matrices) Declaracin: <Tipo/Clase> [ ][ ]identificador; double [ ][ ]x; Creacin: 1. Un arreglo bidimensional vacio: double [ ][ ]x=new double[3][2]; 2. Con valores iniciales double [ ][ ]x={{1.0,2.0},{6.0,5.0},{10.0,8.0}}; Operaciones Bsicas Lectura: Obtener un elemento contenido en la matriz: double r = x [1][1]=5; 2. Modificacin: Actualizar al elemento: x [2][0]=4.0; 3. Presentacin: Utilizar un ciclo repetitivo que recorre las filas(i); y otro ciclo anidado que recorre a las columnas(j). for(int i=0; i<n;i++){ for(int j=0;j<n;j++){ System.out.println(x[i][j]); } } Matriz + n: entero //dimensin de la matriz - x[ ][ ]:doubl // array bidimensional //constructores + Matriz(n: entero) + Matriz(x [ ][ ]double) //mtodos de la clase Matriz + suma(a: Matriz,b Matriz): Matriz + resta(a: Matriz,b Matriz): Matriz + multiplicacion(a: Matriz,b Matriz): Matriz + productoEscalar(double,a: Matriz): Matriz + transpuesta(a: Matriz): Matriz + sumaDiagonal(): double +sumElemSobDiagonal():doubl package finalmat; /** * @author Ing. Mireya Erreyes Tarea 4: Implemente la clase Matriz, que es la abstraccin de una matriz cuadrada considere el siguiente modelo: Curso de Estructuras de Datos Orientada a Objetos 11 */ public class Matriz {

/** Miembros dato */ public int n; //dimensin private double[][] x; //Array bidimensional //Constructores public Matriz(int n) { this.n=n; x=new double[n][n]; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ x[i][j]=0.0; } } } public Matriz(double[][] x) { this.x=x; n=x.length; } //Para mostrar los datos redefinimos la funcin toString //de la Clase base Object de la cual deriva implicitamente Matriz public String toString(){ String texto="\n"; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ //texto+="\t "+(double)Math.round(1000*x[i][j])/1000; texto+="\t "+x[i][j]; } texto+="\n"; } Curso de Estructuras de Datos Orientada a Objetos 12 // texto+="\n"; return texto; } 1.3.Conjuntos TDA CO/JU/TOS Elementos: Puede ser cualquier tipo de objetos (elementos diferentes). Estructura: Tiene una estructura lineal entre los objetos del conjunto. Dominio: Son todos los datos posibles a guardar dentro del rango definido por el usuario en relacin con el tipo de aplicacin de la estructura. OPERACIO/ES: - U_ION : AU B = {x A o x B} Utilidad: Que se reemplaza en A con la unin A y B, esto es ejecutar A A B Datos de Entrada: Dos conjuntos { }A, { }B. Datos de Salida: El conjunto {}A modificado o tambin puede ser un nuevo conjunto {}C. Precondiciones: Que el conjunto {}A, y {}B existan. Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la unin - I_TERSECCIO_: AI B = {x A y x B} Utilidad: Se reemplazar en {}A con la interseccin del conjunto A y B, esto es ejecutar A AI B. Datos de Entrada: Dos conjuntos { }A, { }B.

Datos de Salida: El conjunto {}A modificado o tambin puede ser un nuevo conjunto {}C. Precondiciones: Que el conjunto {}A, y {}B existan. Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la intersecsin. - DIFERE_CIA: A B ={x A o xB} Utilidad: Reemplaza en A con la diferencia A y B, esto es ejecutar A A B. Datos de Entrada: Dos conjuntos { }A, { }B. Datos de Salida: El conjunto {}A modificado o tambin puede ser un nuevo conjunto {}C. Precondiciones: Que el conjunto {}A, y {}B existan. Postcondiciones: El conjunto {}A o el {}C contiene los elementos de la diferencia del conjunto {}A, y {}B. Se puede realizar stas operaciones sobre el primer conjunto o sea el conjunto A se definir a stas operaciones sin alterar al conjunto A, devolviendo en un nuevo conjunto que podra ser el conjunto C. El paquete Java.util, incluye la interfaz SET, que tiene como caractersticas las siguientes: Un conjunto no puede contener elementos duplicados Incluye mtodos parecidos a los definidos en el TDA mencionado anteriormente Correspondencia entre TDA CO_JU_TO y la Interfaz Java.util.Set TDA CO/JUnTO Interfaz Java.util.Set Unin addAll (collection c) Interseccin retainAll(collection c) Diferencia removeAll(collection c) Ejemplo de representacin de la operaciones(Unin, Interseccin y Diferencia de la Estructura Conjunto en Java import java.util.*; public class Miconjunto { public Miconjunto() { } public static void main(String[] args) { //Declaracion de los conjuntos Set a = new TreeSet(); Set b = new TreeSet(); //Aadir elementos a los conjuntos a.add(1); a.add(3); a.add(5); a.add(3);// elemento repetido no se aade al conjunto b.add(4); b.add(5); b.add(7); b.add(10); b.add(12); System.out.println("Numero de elementos del conjunto A es: "+ a.size()); System.out.println("Elementos del conjunto A son: "+ a); System.out.println("Numero de elementos del conjunto B es: "+ b.size()); System.out.println("Elementos del conjunto B son: "+ b); //Operaciones con los conjuntos a.addAll(b); // union System.out.println("A Union B: "+ a); a.retainAll(b); //interseccion

System.out.println("A Interseccion B : "+ a); a.add(2); a.add(4); a.removeAll(b); // diferencia System.out.println("A diferencia B : "+ a); } } SALIDA POR PANTALLA Nmero de elementos del conjunto A es: 3 Elementos del conjunto A son: [1, 3, 5] Nmero de elementos del conjunto B es: 5 Elementos del conjunto B son: [4, 5, 7, 10, 12] A Union B: [1, 3, 4, 5, 7, 10, 12] A Interseccin B : [4, 5, 7, 10, 12] A diferencia B : [2] BUILD SUCCESSFUL (total time: 1 second) Curso de Estructuras de Datos Orientada a Objetos 16 Ejemplo de representacin de las operaciones con Subconjuntos en Java import java.util.*; public class Main { public Main() { } public static void main(String[] args) { // Crear el conjunto SortedSet ss = new TreeSet(); /* for(int i=9; i>=0 ; i--) ss.add(new Integer(i)); System.out.println(ss);*/ for(int i=0; i<=9 ; i++) ss.add(new Integer(i)); System.out.println("Conjunto original: "+ss); //Eliminar el 6 ss.remove(new Integer(6)); System.out.println("Luego de elminar el 6: "+ss); //Crear un vista SortedSet vista = ss.tailSet(new Integer(5)); //SortedSet vista = ss.tailSet(5); System.out.println("Vista del ss: " + vista); //Se aade a la coleccion principal el numero 6 ss.add(new Integer(6)); System.out.println("Se aade un nuevo elemento a la coleccion original"); System.out.println("Vista: "+vista); System.out.println("Conjunto Original :"+ss); //Si se borra de la vista tambien afect al original System.out.println("Se borra el 9 a la vista borra a la coleccion original"); vista.remove(new Integer(9)); System.out.println("Vista :"+vista); System.out.println("Conjunto original: "+ss); // Insercion en la vista de un elemento fuera de rango

//Provoca una excepcion try { vista.add(new Integer(4)); } catch(IllegalArgumentException e) { System.out.println("Se quiere aadir un elemento fuera del rango"); } System.out.println("Vista sin aadir el 4 : "+vista); // sin aadir el elemento //Se puede crear una vista de otra pero siempre que los argumentos //de la segunda se encuentren en el rango de la primera. SortedSet vistaDeVista = vista.headSet(new Integer(7)); System.out.println("Vista de vista"+vistaDeVista); //Si no es as obtenemos una excepcin try { vistaDeVista = vista.subSet(new Integer(4), new Integer(7)); Curso de Estructuras de Datos Orientada a Objetos 17 } catch(IllegalArgumentException e) { System.out.println("El rango de la nueva vista no est contenido en la vista original"); } vista = ss.subSet(0,6); System.out.println("Set"+ss); System.out.println(" Sub set"+vista); } } SALIDA POR PANTALLA Conjunto original: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Luego de elminar el 6: [0, 1, 2, 3, 4, 5, 7, 8, 9] Vista del ss: [5, 7, 8, 9] Se aade un nuevo elemento a la coleccion original Vista: [5, 6, 7, 8, 9] Conjunto Original :[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Se borra el 9 a la vista borra a la coleccion original Vista :[5, 6, 7, 8] Conjunto original: [0, 1, 2, 3, 4, 5, 6, 7, 8] Se quiere aadir un elemento fuera del rango Vista sin aadir el 4 : [5, 6, 7, 8] Vista de vista[5, 6] El rango de la nueva vista no est contenido en la vista original Set[0, 1, 2, 3, 4, 5, 6, 7, 8] Sub set[0, 1, 2, 3, 4, 5] BUILD SUCCESSFUL (total time: 0 seconds) 1.4. Archivos o ficheros La estructura de datos tipo archivo (ficheros) es la nica estructura de datos que se almacena en memoria secundaria o externa (disco o cinta). Un archivo de datos es una estructura constituida simplemente por colecciones de datos que se pueden guardar, para uso posterior mediante la ejecucin de programas adecuados. Otra caracterstica importante de los archivos es que permite almacenar gran cantidad de informacin. Esta coleccin de datos sirve para la entrada y salida a la computadora y se maneja con un programa en contraste con archivos y registros, el tamao de esta coleccin no es fija y est limitada solo por la cantidad de memoria secundaria (disco o cinta) disponible. Es decir, los

archivos son dinmicos, esto es que se pueden hacer archivos de datos ms grandes o ms pequeos segn sean las necesidades. Los archivos no estn limitados por la memoria donde estn contenidas las estructuras. Cada archivo se puede manipular por un identificador. Un archivo est compuesto por un conjunto de registros que es una coleccin de los elementos de informacin sobre una entidad particular, los diferentes elementos se conocen como campo que pueden guardar informacin diferente, y estos pueden a su vez contener subcampos los que estn compuestos de caracteres. Mtodos de acceso a un archivo Curso de Estructuras de Datos Orientada a Objetos 18 Un mtodo de acceso, no es ms que la forma como recuperar la informacin del archivo, a veces se pude procesar dato por dato, en otras veces se podra acceder rpidamente a un dato sin recuperar los datos anteriores. Existen dos mtodos para acceder a un archivo de datos: acceso secuencial y acceso aleatorio. Acceso Secuencial Exige el tratamiento elemento a elemento es necesario una exploracin secuencial comenzando desde el primer elemento hasta llegar al elemento buscado. Acceso Aleatorio o Directo Permite procesar o acceder a determinado elemento mediante una direccin en el soporte de almacenamiento. Representacin Grafica Clases de archivos Los archivos se clasifican de acuerdo a las funciones que realizan: _ Archivos permanentes.- Son aquellos cuyos registros sufren poca o ninguna variacin a lo largo del tiempo. Se dividen en: Constantes: estn formados por registros que contienen campos fijos y campos de baja frecuencia de variacin en el tiempo. De situacin: son los que en cada momento contienen informacin actualizada. Histricos: contienen informacin acumulada a lo largo del tiempo de archivos que han sufrido procesos de actualizacin, o bien acumulan datos de variacin peridica en el tiempo. _ Archivos de movimiento o transacciones.- Son aquellos que se utilizan conjuntamente con los maestros (constantes), y contienen algn campo comn en sus registros con aquellos, para el procesamiento de las modificaciones experimentadas por los mismos. El perodo de conservacin es breve, ya que suelen destruirse una vez efectuados los cambios sobre el maestro. _ Archivos de maniobra o transitorios.- Son los archivos auxiliares creados durante la ejecucin del programa y borrados habitualmente al terminar el mismo. Pertenecen tambin a este tipo los utilizados para comprobacin de los resultados intermedios en un determinado proceso. a c b puntero elementos Acceso directo ndice (posicin) Acceso a un archivo secuencial

Acceso a un archivo directo Curso de Estructuras de Datos Orientada a Objetos 19 _ Archivos de informes.- Contiene datos que estn organizados para presentaciones a los usuarios. _ Archivos de programa.- Contienen instrucciones para procesar datos que se almacena en otros archivos o residen en memoria. _ Archivos de texto.- Contienen datos alfanumricos y grficos introducidos por un editor de texto. Representacin de la Estructura Archivo 1. SECUENCIAL: Entre sus principales caractersticas tenemos ms sencillos de implementar, no es eficiente cuando la cantidad de datos a almacenar es grande, deben actualizarse en forma peridica para reflejar los cambios dados en la informacin almacenada. Ejemplo: archivo que almacena los datos de los clientes de un banco, al obtener dinero de un cajero automtico.

2. INDEXADOS: Entre sus principales caractersticas tenemos: que este tipo de archivos requiere que se conozca la direccin donde se encuentra el dato a buscar, se compone de un archivo de datos(secuencial) y un archivo de ndices(guarda las llaves o clave del archivo secuencial, o sea la direccin del dato correspondiente en disco).

Tipos de archivos Texto: Solo permiten acceso secuencial y su unidad constitutiva es el carcter. Acceso directo: Se puede acceder secuencial o aleatoriamente y est compuesto por bytes. Con tipo o Serializables: Se puede acceder secuencialmente, y solo trabaja con objetos. Ejemplo de manejo de un archivo tipo texto. import java.io.*; public static void main( String args[] ) throws IOException {

//****************CREAR EL FICHERO************************** File f = new File ("c:\\mire\\datos.txt"); //File f = new File ("c:\\mire","datos.txt"); //*************ESCRIBIR EN EL FICHERO************************* //Recuerda que la filosofa de acceso a la lectura y escritura a los ficheros, //siempre es la misma. Buffer, que envuelve a Reader, que a su vez envuelve al fichero (o stream). BufferedWriter bw = new BufferedWriter(new FileWriter(f)); //Para escribir utilizamos en el mtodo .write() del buffer. // Vamos a volcar 10 lneas iguales ayudndonos de un bucle for. for (int x=0;x<10;x++) import java.io.*; public static void main( String args[] ) throws IOException { //****************CREAR EL FICHERO************************** File f = new File ("c:\\mire\\datos.txt"); //File f = new File ("c:\\mire","datos.txt"); //*************ESCRIBIR EN EL FICHERO************************* //Recuerda que la filosofa de acceso a la lectura y escritura a los ficheros, //siempre es la misma. Buffer, que envuelve a Reader, que a su vez envuelve al fichero (o stream). BufferedWriter bw = new BufferedWriter(new FileWriter(f)); //Para escribir utilizamos en el mtodo .write() del buffer. // Vamos a volcar 10 lneas iguales ayudndonos de un bucle for. for (int x=0;x<10;x++) Exposicin Nro. 3: Investiga en el Api de Java para Archivos, la clase File, RandomAccessFile, BufferedReader, BufferedWriter, que pertenece al paquete Java.io; para cada una debe indicar detalladamente, sus constructores y para la explicacin de las principales operaciones exponer la utilidad, sintaxis y un ejemplo de su utilizacin. Adems debe realizar un programa demostrativo de manipulacin de Archivos en Java, por ejemplo una agenda telefnica. Nota: Se tomar en cuenta el material de apoyo utilizado para la exposicin y debe entregar una copia digital a cada grupo, adems una copia impresa y digital a la profesora el da de la exposicin. Curso de Estructuras de Datos Orientada a Objetos 21 bw.write("Fila Nro." + x + " HOLA "+ "\n"); bw.close(); //***************METODOS DE FICHEROS ************************ System.out.println( "Nombre: "+f.getName() ); System.out.println( "Camino: "+f.getPath() ); if( f.exists() ){ System.out.print( "Fichero existente " ); System.out.print( (f.canRead() ? " se puede Leer" : "") ); System.out.println( (f.canWrite() ? " y se puede Escribir" :") ); System.out.println( "La longitud del fichero son "+ f.length()+" bytes" );} else System.out.println( "El fichero no existe." ); //*************LEER EL ARCHIVO******************************** //Manejar el buffer Reader es muy sencillo ya que simplemente deberemos de //ejecutar lecturas por lnea.

FileReader fr= new FileReader(f); BufferedReader br = new BufferedReader(fr); String texline=br.readLine(); while(!texline.equals("FIN")){ System.out.println(texline); texline = br.readLine(); } br.close(); } SALIDA POR PANTALLA Nombre: datos.txt Camino: c:\mire\datos.txt Fichero existente se puede Leer y se puede Escribir La longitud del fichero son 170 bytes Fila Nro.0 HOLA Fila Nro.1 HOLA Fila Nro.2 HOLA Fila Nro.3 HOLA Fila Nro.4 HOLA Fila Nro.5 HOLA Fila Nro.6 HOLA Fila Nro.7 HOLA Fila Nro.8 HOLA Fila Nro.9 HOLA Ejemplo de manejo de un archivo tipo de acceso Aleatorio import java.io.*; public static void main( String args[] ) throws IOException { //DECLARAMOS EL ARCHIVO RandomAccessFile Rf; String s = "Informacion\n"; Curso de Estructuras de Datos Orientada a Objetos 22 // ABRIMOS EL FICHERO DE ACCESO ALEATORIO Rf = new RandomAccessFile( "c:\\mire\\fialeatorio.log","rw" ); // NOS VAMOS AL FINAL DEL FICHERO, INCORPORAMOS LA CADENA AL FICHERO Rf.seek( Rf.length() ); Rf.writeBytes( s ); System.out.println("El tamao del fichero es: "+Rf.length()); Rf.writeBytes("Mas datos..."); System.out.println("El tamao del fichero es: "+Rf.length()); //NOS UBICAMOS EN LA POSICION 12 Y AADIMOS LA CADENA HOLA Rf.seek(12); Rf.writeBytes("Hola"); System.out.println("El tamao del fichero es: "+Rf.length()); // PRESENTAMOS LOS DATOS DEL ARCHIVO Rf.seek(0); String linea=Rf.readLine(); while(!linea.equals("FIN")){ System.out.println(linea); linea = Rf.readLine(); }

// CERRAMOS EL FICHERO Rf.close(); } SALIDA POR PANTALLA El tamao del fichero es: 12 El tamao del fichero es: 24 El tamao del fichero es: 24 Informacion Holadatos... Ejemplo de manejo de un archivos Serializables MODELADO Clase Datos Datos #nombre:String #telefono: String #direccion:String +Datos(String n, String t, String d); +getNombre():String +getTelefono():String +getDireccion():String Curso de Estructuras de Datos Orientada a Objetos 23 Clase de Lectura ContadoInput -f:FileInputStream -fi:ObjectInputStream +abrir():void +cerrar():void +leer():Datos Clase de Escritura ContactoOutput -f:FileOutputStream -sf:ObjectOutputStream +abrir():void +cerrar():void +escribir(Datos d):void IMPLEME/TACI/ public class Datos implements java.io.Serializable { protected String nombre; protected String telefono; protected String direccion; /** Creates a new instance of Datos */ public Datos(String n, String t, String d){ nombre = n; telefono = t; direccion = d; } public String getNombre() { return( nombre ); }

public String getTelefono() { return( telefono ); } public String getDireccion() { return( direccion ); } public void print() { System.out.println( nombre+"\n "+telefono+"\n "+ direccion ); } public String toString(){ String texto="\n"; texto ="\t " +nombre+"\t "+telefono+"\t "+direccion + "\n"; return texto; } Curso de Estructuras de Datos Orientada a Objetos 24 } //================= GUARDAR OBJETOS EN EL ARCHIVO=========== import java.io.*; public static void main( String argv[] )throws IOException { FileOutputStream fo = new FileOutputStream("c:\\mire\\direcciones.txt"); ObjectOutputStream ow = new ObjectOutputStream(fo); ow.writeObject(new Datos("Maria","2546788","Las Pitas")); ow.writeObject(new Datos("Luis","2574643","Las Peas")); ow.writeObject(new Datos("Andres","2577903","La Argelia")); ow.close(); FileInputStream fi = new FileInputStream("c:\\mire\\direcciones.txt"); ObjectInputStream ol = new ObjectInputStream(fi); try{ while(!ol.equals(null)) System.out.print(ol.readObject()); }catch (Exception e){ System.out.println("Error");} ol.close(); } SERIALIZACION DE OBJETOS. --- clase Datos---============= CLASE ESCRITURA========================== import java.io.*; public class ContactoOutput { /** Creates a new instance of ContactoOutput */ public ContactoOutput() { } private FileOutputStream f; private ObjectOutputStream sf; //Abrir el fichero; public void abrir() throws IOException{ f= new FileOutputStream("c:\\mire\\alumno.ser"); sf = new ObjectOutputStream(f); }

//Cerrar el fichero public void cerrar() throws IOException{ if (sf != null) sf.close(); } //Escribir en el fichero public void escribir(Datos d) throws IOException { if (sf != null) sf.writeObject(d); } } ============= CLASE LECTURA========================== import java.io.*; public class ContactoInput { /** Creates a new instance of ContactoInput */ public ContactoInput() { Curso de Estructuras de Datos Orientada a Objetos 25 } private FileInputStream f; private ObjectInputStream fi; public void abrir() throws IOException { f = new FileInputStream("c:\\mire\\alumno.ser"); fi = new ObjectInputStream(f); } public void cerrar() throws IOException{ if (fi != null) fi.close(); } public Datos leer() throws IOException, ClassNotFoundException{ Datos da = null; if (fi!= null){ try{ da = (Datos) fi.readObject(); }catch (EOFException eof){ System.out.print("Fin de archivo"); } } return da; } } ================= EJECUTOR============================ import java.io.*; public class FicheroSer { public static void main(String[] args) throws IOException, ClassNotFoundException{ //Escritura en el archivo ContactoOutput fw; fw = new ContactoOutput(); fw.abrir(); fw.escribir(new Datos("Maria", "2567898","Las Pitas"));

fw.escribir(new Datos("Jose","2546787","La Argelia")); fw.cerrar(); //Lectura de datos Datos da; ContactoInput fr; fr= new ContactoInput(); fr.abrir(); do { da= fr.leer(); System.out.println(da); }while (da!=null); fr.cerrar(); } } ============ SALIDA POR PANTALLA============== Maria 2567898 Las Pitas Curso de Estructuras de Datos Orientada a Objetos 26 Jose 2546787 La Argelia Fin de archivonull BUILD SUCCESSFUL (total time: 3 seconds 1. MTODOS DE ORDE_ACI_ Los mtodos de ordenacin, bsqueda e intercambio, son operaciones bsicas en las que las computadoras emplean la mitad de su tiempo. Su mayor utilizacin se d en las estructuras arreglos y archivos. La ordenacin tambin es conocida como clasificacin, no es ms que la operacin de organizar un conjunto da datos en un orden dado, que puede ser creciente o decreciente cuando se trata de datos numricos y en orden alfabtico directo o inverso cuando se trata de caracteres. Existe gran cantidad de algoritmos diseados para clasificar listas de elementos, la eleccin del mejor mtodo depende del tamao del vector o archivo, el tipo de datos a ordenar y la cantidad de memoria fsica disponible. Categoras _ Interna: Se utiliza para la ordenacin de vectores o arreglos, tablas etc. _ Externa: Se utiliza para la ordenacin de datos de un archivo. Difencias entre Ordenacin interna y externa Interna Externa Los datos se almacenan en memoria interna, que es de gran velocidad y acceso aleatorio Los datos se almacenan en soportes de almacenamiento externo: discos, cintas, que resultan ms lentos pero contienen mayor cantidad de informacin. 1.1.Mtodo de Intercambio El mtodo de intercambio es el ms sencillo de todos. Se basa en: la lectura sucesiva de la lista a ordenar, comparando el elemento inferior o superior (dependiendo de la forma del recorrido) de la lista con todos los restantes, efectuando el Intercambio de posiciones cuando el orden resultante no sea correcto.

Ejemplo: a = { 8, 4, 6, 2 } Pasada 1: Se compara a[0] con todos, as primero se cambia a[0] con a[1] pues a[0] > a[1] y debe ser Ascendente, es decir a[0]<a[1] y por utimo a[0] con a[3]. 26 {4, 8, 6, 2} => Se intercambia 4 por 8. {4, 8, 6, 2} {2, 8, 6, 4} => Se intercambia 2 por 4. Pasada 2: El elemento ms pequeo esta en a[0] y se analiza la sublista restante, es decir comenzamos en el siguiente elemento a[1]. Al cabo de la pasada, el segundo ms chico esta en a[1] y as sucesivamente. Curso de Estructuras de Datos Orientada a Objetos 2 {2, 6, 8, 4} => Se intercambia 6 por 8. {2, 4, 8, 6} => Se intercambia 4 por 6. Pasada 3: Ahora nos toca comparar con el elemento a[2]. {2, 4, 6, 8} => Se intercambia 6 por 8. Se terminan las pasadas y el arreglo o lista queda ordenado. Anlisis del mtodo: Nmero de Pasadas = n 1; Nmero Mximo de Comparaciones = (n-1) (n-2) Tiempo de Ejecucin = 0 (n2); donde n es el nmero de elementos en el arreglo o lista. 1.2.Mtodo de la burbuja Es un mtodo mejorado con respecto al intercambio, en donde los elementos burbujean, es decir, los ms grandes, caen al fondo del array (posicin n-1) y los ms mas chicos suben a la cima (posicin 0). Estudia parejas de elementos Adyacentes, a[0] y a[1], a[1] y a[2] a[i] y a[i+1] a[n 2] y a[n 1]. Si a[i+1] < a[i] Entonces los INTERCAMBIA Ejemplo: {40,21,4,9,10,35}: Pasada 1: {21, 40, 4, 9, 10, 35} <-- Se cambia el 21 por el 40. {21, 4, 40, 9, 10, 35} <-- Se cambia el 40 por el 4. {21, 4, 9, 40, 10, 35} <-- Se cambia el 9 por el 40. {21, 4, 9, 10, 40, 35} <-- Se cambia el 40 por el 10. {21, 4, 9, 10, 35, 40} <-- Se cambia el 35 por el 40. Pasada 2: {4, 21, 9, 10, 35, 40} <-- Se cambia el 21 por el 4. {4, 9, 21, 10, 35, 40} <-- Se cambia el 9 por el 21. {4, 9, 10, 21, 35, 40} <-- Se cambia el 21 por el 10. {4, 9, 10, 21, 35, 40} Ya estn ordenados, pero habra que hacer una tercera, cuarta y quinta pasada. Anlisis del mtodo: Nmero de Pasadas = n 1; Nmero Mximo de Comparaciones = n(n-1)/2 Curso de Estructuras de Datos Orientada a Objetos 3 Tiempo de Ejecucin = 0 (n2); dnde n es el nmero de elementos en el arreglo o lista. 1.3.Mtodo de seleccin. Este mtodo consiste en buscar el elemento ms pequeo del array y ponerlo en la primera

posicin; luego, entre los restantes, se busca el elemento ms pequeo y se coloca en segundo lugar, y as sucesivamente hasta colocar el ltimo elemento. Por lo tanto, debe realizar sucesivas pasadas hasta que no haya posiciones restantes. Ejemplo: {40, 21, 4, 9, 10, 35} Pasada 1: {4, 21, 40, 9, 10, 35} <-- Se coloca el 4, el ms pequeo, en primera posicin: se cambia el 4 por el 40. Pasada 2: {4, 9, 40, 21, 10, 35} <-- Se coloca el 9, en segunda posicin: se cambia el 9 por el 21. Pasada 3: {4, 9, 10, 21, 40, 35} <-- Se coloca el 10, en tercera posicin: se cambia el 10 por el 40. Pasada 4: {4, 9, 10, 21, 40, 35} <-- Se coloca el 21, en tercera posicin: ya est colocado. Pasada 5: {4, 9, 10, 21, 35, 40} <-- Se coloca el 35, en tercera posicin: se cambia el 35 por el 40. Anlisis del mtodo: Nmero de Pasadas = n 1; Nmero Mximo de Comparaciones = n(n-1)/2 Tiempo de Ejecucin = 0 (n2); dnde n es el nmero de elementos en el arreglo o lista. 1.4.Mtodo de insercin directa Este mtodo lo que se hace es tener una sublista ordenada de elementos del array e ir insertando el resto en el lugar adecuado para que la sublista no pierda el orden. La sublista ordenada se va haciendo cada vez mayor, de modo que al final la lista entera queda ordenada, u otra forma de entender es que, consiste en insertar un elemento en su posicin correcta, dentro de una lista que ya est Ordenada Ejemplo: se tiene {40, 21, 4, 9, 10, 35} {40, 21, 4, 9, 10, 35} <== La primera sublista ordenada es {40}. Insertamos el 21: Curso de Estructuras de Datos Orientada a Objetos 4 {40, 40, 4, 9, 10, 35} <== aux=21; {21, 40, 4, 9, 10, 35} <== Ahora la sublista ordenada es {21,40}. Insertamos el 4: {21, 40, 40, 9, 10, 35} <== aux=4; {21, 21, 40, 9, 10, 35} <== aux=4; {4, 21, 40, 9, 10, 35} <== Ahora la sublista ordenada es {4,21,40}. Insertamos el 9: {4, 21, 40, 40, 10, 35} <== aux=9; {4, 21, 21, 40, 10, 35} <== aux=9; {4, 9, 21, 40, 10, 35} <== Ahora la sublista ordenada es {4,9,21,40}. Insertamos el 10: { 4, 9, 21, 40, 40, 35} <== aux=10; {4, 9, 21, 21, 40, 35} <== aux=10; {4, 9, 10, 21, 40, 35} <== Ahora la sublista ordenada es {4,9,10,21,40}. Y por ltimo insertamos el 35:

{ 4, 9, 10, 21, 40, 40} <== aux=35; {4, 9, 10, 21, 35, 40} <== El array est ordenado. Anlisis del mtodo: Dnde n es el nmero de elementos en el arreglo o lista. Peor de los casos: Nmero Mximo de Comparaciones = n*(n+1)/2-1; Tiempo de Ejecucin = 0 (n2); Mejor de los casos (cuando la lista o arreglo ya esta ordenada): Nmero Mximo de Comparaciones = n 2; (Todas ellas falsas). Tiempo de Ejecucin = 0 (n); El caso medio depender de cmo estn inicialmente distribuidos los elementos. Vemos que cuanto ms ordenada est inicialmente ms se acerca a O(n) y cuanto ms desordenada, ms se acerca a O(n2). El peor caso es igual que en los mtodos de burbuja y seleccin, pero el mejor caso es lineal, algo que no ocurra en stos, con lo que para ciertas entradas podemos tener ahorros en tiempo de ejecucin. 1.5.Mtodo shell Debe su nombre a su inventor D.L.Shell, es un Mtodo Avanzado que se le suele llamar Ordenacin Por Insercin con Intervalos Decrecientes, lo cual es una mejora al mtodo de Insercin directa cuando el arreglo o lista tiene una gran cantidad de elementos. En este mtodo no se compara a cada elemento con el de su izquierda, como en el de insercin, sino con el que est a un cierto nmero de lugares (llamado salto) a su izquierda. Este salto es constante, y su valor inicial es N/2 (siendo N el nmero de elementos, y siendo divisin entera). Se van dando pasadas hasta que en una pasada no se intercambie ningn Curso de Estructuras de Datos Orientada a Objetos 5 elemento de sitio. Entonces el salto se reduce a la mitad, y se vuelven a dar pasadas hasta que no se intercambie ningn elemento, y as sucesivamente hasta que el salto vale 1. Ejemplo: se tiene {40, 21, 4, 9, 10, 35} n=6 Salto = 3; dnde n/2; Primera pasada: {9, 21, 4, 40, 10, 35} <== se intercambian el 40 y el 9. {9, 10, 4, 40, 21, 35} <== se intercambian el 21 y el 10. {9, 10, 4, 40, 21, 35} Salto = 1; dnde salto/2 ; Primera pasada: {9, 10, 4, 40, 21, 35} {9, 4, 10, 40, 21, 35} <== se intercambian el 10 y el 4. {9, 4, 10, 40, 21, 35} {9, 4, 10, 21, 40, 35} <== se intercambian el 40 y el 21. { 9, 4, 10, 21, 35, 40} <== se intercambian el 35 y el 40. Segunda pasada: {4, 9, 10, 21, 35, 40} <== se intercambian el 4 y el 9. Con slo 6 intercambios se ha ordenado el array, cuando por insercin se necesitaban muchos ms. Anlisis del mtodo: Tiempo de Ejecucin = O(n*(Log2 n)); Dnde n es el nmero de elementos en el arreglo o lista. 1.6.Mtodo de ordenacin rpida (quicksort)

Este mtodo se basa en la tctica "divide y vencers" que consiste en ir subdividiendo el array en arrays ms pequeos, y ordenar stos. Para hacer esta divisin, se toma un valor del array como pivote, y se mueven todos los elementos menores que este pivote a su izquierda, y los mayores a su derecha. A continuacin se aplica el mismo mtodo a cada una de las dos partes en las que queda dividido el array. Normalmente se toma como pivote el primer elemento de array, y se realizan dos bsquedas: una de izquierda a derecha, buscando un elemento mayor que el pivote, y otra de derecha a izquierda, buscando un elemento menor que el pivote. Cuando se han encontrado los dos, se intercambian, y se sigue realizando la bsqueda hasta que las dos bsquedas se encuentran. Ejemplo: Para dividir el array {21,40,4,9,10,35}, los pasos seran: {21, 40, 4, 9, 10, 35} <== se toma como pivote el 21. La bsqueda de izquierda a derecha encuentra el valor 40, mayor que pivote, y la bsqueda de derecha a izquierda encuentra el valor 10, menor que el pivote. Se intercambian: Curso de Estructuras de Datos Orientada a Objetos 6 {21, 10, 4, 9, 40, 35} <== Si seguimos la bsqueda, la primera encuentra el valor 40, y la segunda el valor 9, pero ya se han cruzado, as que paramos. Para terminar la divisin, se coloca el pivote en su lugar (en el nmero encontrado por la segunda bsqueda), el 9, quedando: {9, 10, 4, 21, 40, 35} <== Ahora tenemos dividido el array en dos arrays ms pequeos: el {9,10,4} y el {40,35}, y se repetira el mismo proceso. La implementacin es claramente recursiva y suponiendo el pivote el primer elemento del array, el programa sera (en el mtodo main): ordenar(array,0,array.length); // Para llamar a la funcin. Anlisis del mtodo: Tiempo de Ejecucin = O(n(Log n)); Dnde n es el nmero de elementos en el arreglo o lista. Implementacin de los Mtodos de Ordenacin Mtodos package arreglos; /** * * @author Mireya Erreyes */ public class Metodos { public Metodos() { } //Ordena ascendentemente por el mtodo de Intercambio public void intercambio(int a[]){ int aux; for(int i=0; i<=a.length-2;i++){ for(int j=i+1;j<=a.length-1;j++){ if(a[i]>a[j]){ aux=a[i]; a[i]=a[j]; a[j]=aux; } } }

} //Ordena ascendentemente por el mtodo de la Burbuja public void burbuja(int a[]){ int aux; for(int i=0; i<=a.length-1;i++){ for(int j=0;j<a.length-i-1;j++){ if(a[j+1]<a[j]){ aux=a[j+1]; a[j+1]=a[j]; a[j]=aux; } Curso de Estructuras de Datos Orientada a Objetos 7 } } } //Ordena ascendentemente por el mtodo de Seleccin public void seleccion(int a[]){ int aux, idmenor; for(int i=0; i<=a.length-1;i++){ aux=a[i]; idmenor=i; for(int j=i+1;j<a.length;j++){ if(a[j]<aux){ idmenor=j; aux=a[j]; } } a[idmenor]=a[i]; a[i]=aux; } } //Ordena ascendentemente por el mtodo de Insercin Directa public void insercionDirecta(int a[]){ int aux; int j; for(int i=0; i<a.length;i++){ aux=a[i]; for(j=i-1;j>=0;j--){ if(aux > a[j]){ a[j+1]=aux; break; }else{ a[j+1]=a[j]; } } if(j==-1) a[0]=aux; } }

//Ordena ascendentemente por el mtodo de Shell public void shellsm(int a[]){ int aux,c,s; s=a.length; while (s!=1) { s=s/2; c=1; while(c==1){ c=0; for(int i=0;i< a.length-s;i++){ if(a[i] > a[i+s]){ aux=a[i]; a[i]=a[i+s]; a[i+s]=aux; c=1; } Curso de Estructuras de Datos Orientada a Objetos 8 } } } } //Ordena ascendentemente por el mtodo de Quick Sort public void quicks(int []a, int izq, int der){ int i=izq; int j=der; int pivote = a[(izq+der)/2]; do{ while(a[i]<pivote){ i++; } while(a[j]>pivote){ j--; } if(i<=j){ int aux=a[i]; a[i]=a[j]; a[j]=aux; i++; j--; } }while(i<=j); if(izq <j){ quicks(a,izq,j); } if(i<der){ quicks(a,i,der); } } public void presenta(String msg,int a[]){

System.out.print(msg+" :"); System.out.print("["); for(int i=0; i<=a.length-1;i++){ if(i<a.length-1){ System.out.print(a[i]+","); }else{ System.out.print(a[i]+"]"); } } System.out.print("\n"); } } Ejecutor package arreglos; /** * * @author Mireya Erreyes */ public class EjecutaMetodos { Curso de Estructuras de Datos Orientada a Objetos 9 public static void main(String[] args) { //Declarar un arreglo int a[]={40,21,9,10,35,4,8,4,10,67,40}; //Objeto de la clase mtodos Metodos ord=new Metodos(); ord.presenta("Desordenados",a); //Ordenar con el mtodo de Intercambio // ord.intercambio(a); // ord.presenta("Ordenados con Intercambio",a); //Ordenar con el mtodo Burbuja // ord.burbuja(a); // ord.presenta("Ordenados con Burbuja",a); //Ordena por seleccion // ord.seleccion(a); // ord.presenta("Ordenados con Seleccin",a); //Ordena por insercin directa // ord.insercionDirecta(a); // ord.presenta("Insercion Directa",a); //Ordenacion con el mtodo Shell // ord.shellsm(a); // ord.presenta("Ordenados Mtodo Shell",a); //Ordena con Quicksort ord.quicks(a,0,a.length-1); ord.presenta("Quicksorted",a); }}Corrida run: Desordenados :[40,21,9,10,35,4,8,4,10,67,40] Quicksorted :[4,4,8,9,10,10,21,35,40,40,67] BUILD SUCCESSFUL (total time: 0 seconds)

También podría gustarte