ALGORITMOS DE ORDENACIÓN Y BÚSQUEDA EN C
|
|
- María Antonia Carmona Peña
- hace 7 años
- Vistas:
Transcripción
1 2012 ALGORITMOS DE ORDENACIÓN Y BÚSQUEDA EN C Asignatura: Algoritmo y Estructura de Datos Departamento de Computación UNAN León
2 TEMA 1: ALGORITMOS DE ORDENACIÓN Y BÚSQUEDA 1.1 INTRODUCCIÓN: Uno de los procedimientos más comunes y útiles en el procesamiento de datos, es la clasificación u ordenación de los mismos. Se considera ordenar al proceso de reorganizar un conjunto de objetos en una secuencia determinada. El objetivo de este proceso generalmente es facilitar la búsqueda de uno o más elementos pertenecientes a un conjunto. Ordenar es simplemente colocar información de una manera especial basándonos en un criterio de ordenamiento. En la computación el ordenamiento de datos también cumple un rol muy importante, ya sea como un fin en sí o como parte de otros procedimientos más complejos. 1.2 CONCEPTOS PRELIMINARES: Clave: La parte de un registro por la cual se ordena la lista. Por ejemplo, una lista de registros con campos nombre, dirección y teléfono se puede ordenar alfabéticamente de acuerdo a la clave nombre. En este caso los campos dirección y teléfono no se toman en cuenta en el ordenamiento. Criterio de ordenamiento (o de comparación): EL criterio que utilizamos para asignar valores a los registros con base en una o más claves. De esta manera decidimos si un registro es mayor o menor que otro. Registro: Un grupo de datos que forman la lista. Pueden ser datos atómicos (enteros, caracteres, reales, etc.) o grupos de ellos, que en C equivalen a las estructuras. 1.3 ORDENAMIENTO DE DATOS: Por lo general, todos los algoritmos de ordenación funcionan de una forma similar. Toman una lista de elementos, en nuestro caso un array, comparan sus elementos siguiendo una estrategia definida y, según el resultado de dicha comparación, mueven los datos de un lugar a otro hasta conseguir una lista (array) final ordenado. La ordenación o clasificación de datos (sort, en inglés) es una operación consistente en disponer un conjunto de datos en algún determinado orden con respecto a uno de los campos de elementos del conjunto. Por ejemplo, cada elemento del conjunto de datos de una guía telefónica tiene un campo nombre, un campo dirección y un campo número de teléfono; la guía telefónica está dispuesta en orden alfabético de nombres; los elementos numéricos se pueden ordenar en orden creciente o decreciente de acuerdo al valor numérico del elemento. En terminología de ordenación, el elemento por el cual está ordenado un conjunto de datos (o se está buscando) se denomina clave. 2
3 Una colección de datos (estructura) puede ser almacenada en un archivo, un array (vector o tabla), un array de registros, una lista enlazada o un árbol. Cuando los datos están almacenados en un array, una lista enlazada o un árbol, se denomina ordenación interna. Si los datos están almacenados en un archivo, el proceso de ordenación se llama ordenación externa. Los métodos (algoritmos) de ordenación son numerosos, por ello se debe prestar especial atención en su elección. 1.4 CÓMO SE SABE CUÁL ES EL MEJOR ALGORITMO?: Cada algoritmo se comporta de modo diferente de acuerdo a la cantidad y la forma en que se le presenten los datos, entre otras cosas. Debes conocer a fondo el problema que quieres resolver, y aplicar el más adecuado. Aunque hay algunas preguntas que te pueden ayudar a elegir: Qué grado de orden tendrá la información que vas a manejar? Si la información va a estar casi ordenada y no quieres complicarte, un algoritmo sencillo como el ordenamiento burbuja será suficiente. Si por el contrario los datos van a estar muy desordenados, un algoritmo poderoso como Quicksort puede ser el más indicado. Y si no puedes hacer una presunción sobre el grado de orden de la información, lo mejor será elegir un algoritmo que se comporte de manera similar en cualquiera de estos dos casos extremos. Qué cantidad de datos vas a manipular? Si la cantidad es pequeña, no es necesario utilizar un algoritmo complejo, y es preferible uno de fácil implementación. Una cantidad muy grande puede hacer prohibitivo utilizar un algoritmo que requiera de mucha memoria adicional. Qué tipo de datos quieres ordenar? Algunos algoritmos sólo funcionan con un tipo específico de datos (enteros, enteros positivos, etc.) y otros son generales, es decir, aplicables a cualquier tipo de dato. Qué tamaño tienen los registros de tu lista? Algunos algoritmos realizan múltiples intercambios (burbuja, inserción). Si los registros son de gran tamaño estos intercambios son más lentos. Se han desarrollado muchas técnicas en este ámbito, cada una con características específicas, y con ventajas y desventajas sobre las demás. Algunas de las más comunes son: Ordenamiento por el método de la burbuja. Ordenamiento por el método de inserción. Ordenamiento por el método de Quicksort. 3
4 1.5 ORDENAMIENO POR MÉTODO DE LA BÚRBUJA (BUBBLESORT): Hay muchas formas de clasificar datos y una de las más conocidas es la clasificación por el método de la burbuja. Es uno de los más simples, es tan fácil como comparar todos los elementos de una lista contra todos, si se cumple que uno es mayor o menor a otro, entonces los intercambia de posición. Veamos a continuación el algoritmo correspondiente, para ordenar una lista de menor a mayor, partiendo de que los datos a ordenar están en una lista de N elementos: 1. Comparamos el primer elemento con el segundo, el segundo con el tercero el tercero con el cuarto, etc. Cuando el resultado de una comparación sea mayor que, se intercambian los valores de los elementos comparados. Con esto conseguimos llevar el valor mayor a la posición n. 2. Repetimos el punto 1, ahora para los N-1 primeros elementos de la lista y así sucesivamente. 3. Repetimos el punto 1, ahora para los N-2 primeros elementos de la lista y así sucesivamente. 4. El proceso termina después de repetir el punto 1, N-1 veces, o cuando al finalizar la ejecución del punto 1 no haya habido ningún cambio. Código en C del algoritmo: Nombre Tipo Uso lista Cualquiera Lista a ordenar TAM Constante entera Tamaño de la lista i Entero Contador j Entero Contador temp El mismo que los elementos de la lista Para realizar los intercambios for (i=0; i<tam; i++) for j=0 ; j<tam - 1; j++) if (lista[j] > lista[j+1]) temp = lista[j]; lista[j] = lista[j+1]; lista[j+1] = temp; 4
5 Veamos con un ejemplo, cómo funciona el algoritmo: Supongamos el siguiente arreglo de enterosa a ordenarse en formato ascendente: int datos[6] = 40,21,4,9,10,35; Primera pasada: 40, 21, 4, 9, 10, 35 21, 40, 4, 9, 10, 35 <-- Se cambia el 21 por el , 4, 40, 9, 10, 35 <-- Se cambia el 40 por el 4. 21, 4, 9, 40, 10, 35 <-- Se cambia el 9 por el , 4, 9, 10, 40, 35 <-- Se cambia el 40 por el , 4, 9, 10, 35, 40 <-- Se cambia el 35 por el 40. Segunda pasada: 21, 4, 9, 10, 35, 40 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 <-- No hay cambio entre el 21 y el 35. 4, 9, 10, 21, 35, 40 <-- El 35 y el 40, no se comparan, porque el 40 es el mayor. En este ejemplo, los datos ya están ordenados, pero para comprobarlo habría que hacer una tercera, cuarta y quinta comprobación. Ejemplo #1: Programa en C que permite introducir una lista con los pesos de los N estudiantes de la asignatura de Programación Estructurada e imprime los pesos en formato ascendente (menor a mayor). //burbuja_ascendente.c #include<stdio.h> #include<stdlib.h> void main() float *pesos,temp; int i,j,nest; printf("cuantos estudiantes son?: "); scanf("%d",&nest); pesos = (float *) malloc(nest *sizeof(float)); if(pesos==null) printf("insuficiente Espacio de Memoria\n"); exit(-1); //Salir del Programa 5
6 for (i = 0; i<nest; i++) printf("peso del Estudiante[%d]: ",i+1); scanf("%f",(pesos+i)); printf("\n****array ORIGINAL****\n"); for (i = 0;i<nest;i++) printf("peso[%d]: %.1f\n",i+1,*(pesos+i)); Algoritmos de Ordenación y Búsqueda en C /*Ordenación del array con el método de la burbuja en formato ascendente*/ for (i=0;i<nest;i++) for(j=0;j<(nest-1);j++) if(pesos[j] > pesos[j+1]) temp=pesos[j]; pesos[j] = pesos[j+1]; pesos[j+1] = temp; printf("\n****array ORDENADO EN FORMATO ASCENDENTE****\n"); for (i = 0;i<nest;i++) printf("peso[%d]: %.1f\n",i+1,*(pesos+i)); Ejemplo de Salida: 6
7 Ejemplo #2: Programa en C que permite introducir una lista con los pesos de los N estudiantes de la asignatura de Programación Estructurada e imprime los pesos en formato descendente (mayor a menor). //burbuja_descendente.c #include<stdio.h> #include<stdlib.h> void main() float *pesos,temp; int i,j,nest; printf("cuantos estudiantes son?: "); scanf("%d",&nest); pesos = (float *) malloc(nest *sizeof(float)); if(pesos==null) printf("insuficiente Espacio de Memoria\n"); exit(-1); //Salir del Programa for (i = 0; i<nest; i++) printf("peso del Estudiante[%d]: ",i+1); scanf("%f",(pesos+i)); printf("\n****array ORIGINAL****\n"); for (i = 0;i<nest;i++) printf("peso[%d]: %.1f\n",i+1,*(pesos+i)); /*Ordenación del array con el método de la burbuja en formato descendente*/ for (i=0;i<nest;i++) for(j=0;j<(nest-1);j++) if(pesos[j] < pesos[j+1]) temp=pesos[j]; pesos[j] = pesos[j+1]; pesos[j+1] = temp; 7
8 printf("\n****array ORDENADO EN FORMATO DESCENDENTE****\n"); for (i = 0;i<nest;i++) printf("peso[%d]: %.1f\n",i+1,*(pesos+i)); Ejemplo de Salida: ANÁLISIS DEL ALGORITMO DE LA BURBUJA: Éste es el análisis para la versión no optimizada del algoritmo: Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Por lo tanto es estable. Requerimientos de Memoria: Este algoritmo sólo requiere de una variable adicional para realizar los intercambios. Tiempo de Ejecución: El ciclo interno se ejecuta n veces para una lista de n elementos. El ciclo externo también se ejecuta n veces. Es decir, la complejidad es n * n = O(n 2 ). El comportamiento del caso promedio depende del orden de entrada de los datos, pero es sólo un poco mejor que el del peor caso, y sigue siendo O(n 2 ). Ventajas: 1. Fácil implementación. 2. No requiere memoria adicional. Desventajas: 1. Muy lento. 2. Realiza numerosas comparaciones. 3. Realiza numerosos intercambios. Este algoritmo es uno de los más pobres en rendimiento. 8
9 1.6 ORDENAMIENTO POR EL MÉTODO DE INSERCIÓN: Este algoritmo también es bastante sencillo. Has jugado cartas? Cómo las vas ordenando cuando las recibes? Podría ser de esta manera: Se toma la primera y la coloco en mi mano. Luego se toma la segunda y la comparo con la que tengo: si es mayor, la pongo a la derecha, y si es menor a la izquierda (también me fijo en el color, pero omitiremos esa parte para concentrarme en la idea principal). Después tomar la tercera y compararlas con las que se tienen en la mano, desplazándola hasta que quede en su posición final. Continuar haciendo esto, insertando cada carta en la posición que le corresponde, hasta tener todas en orden. Lo haces así tú también? Bueno, pues si es así entonces comprenderás fácilmente este algoritmo, porque es el mismo concepto. Para simular esto en un programa necesitamos tener en cuenta algo: no podemos desplazar los elementos así como así o se perderá un elemento. Lo que se hace es guardar una copia del elemento actual (que sería como la carta que tomamos) y desplazar todos los elementos mayores hacia la derecha. Luego copiamos el elemento guardado en la posición del último elemento que se desplazó. El algoritmo para este método es el siguiente: inicialmente se ordenan los dos primeros elementos del array, luego se inserta el tercer elemento en la posición correcta con respecto a los tres primeros elementos ya clasificados y así sucesivamente hasta llegar al último elemento del array. Código en C del algoritmo: Nombre Tipo Uso lista Cualquiera Lista a ordenar TAM Constante Entera Tamaño de la lista i Entero Contador j Entero Contador temp El mismo que los elementos de la lista Para realizar los intercambios for (i=1; i<tam; i++) temp = lista[i]; j = i - 1; while ( (lista[j] > temp) && (j >= 0) ) lista[j+1] = lista[j]; j--; lista[j+1] = temp; 9
10 Veamos con un ejemplo, cómo funciona el algoritmo: Supongamos el siguiente arreglo de enterosa a ordenarse en formato ascendente: int datos[5] = 4,3,5,2,1; temp toma el valor del segundo elemento, 3. La primera carta es el 4. Ahora comparamos: 3 es menor que 4. Luego desplazamos el 4 una posición a la derecha y después copiamos el 3 en su lugar El siguiente elemento es 5. Comparamos con 4. Es mayor que 4, así que no ocurren intercambios. Continuamos con el 2. Es menor que cinco: desplazamos el 5 una posición a la derecha: Comparamos con 4: es menor, así que desplazamos el 4 una posición a la derecha: Comparamos con 3. Desplazamos el 3 una posición a la derecha: Finalmente copiamos el 2 en su posición final: El último elemento a ordenar es el 1. Cinco es menor que 1, así que lo desplazamos una posición a la derecha: Continuando con el procedimiento la lista va quedando así: Ejemplo #3: Programa en C que permite introducir una lista con los pesos de los N estudiantes de la asignatura de Programación Estructurada e imprime los pesos ordenados de menor a mayor utilizando el método de inserción. //inserción.c #include<stdio.h> #include<stdlib.h> void main() float *pesos,indice; int i,j,nest,e; printf("cuantos estudiantes son?: "); scanf("%d",&nest); pesos = (float *) malloc(nest *sizeof(float)); 10
11 if(pesos==null) printf("insuficiente Espacio de Memoria\n"); exit(-1); //Salir del Programa for (i=0; i<nest; i++) printf("peso del Estudiante[%d]: ",i+1); scanf("%f",&pesos[i]); Algoritmos de Ordenación y Búsqueda en C printf("\n****array ORIGINAL****\n"); for (i=0;i<nest;i++) printf("peso[%d]: %.1f\n",i+1,pesos[i]); //Ordenación del array a través del método de inserción for (e=1;e<nest;e++) printf("\n****array ORDENADO****\n"); for (i = 0;i<nest;i++) indice = pesos[e]; printf("peso[%d]: %.1f\n",i+1,pesos[i]); j = e-1; while (j>=0 && pesos[j]>indice) pesos[j+1] = pesos[j]; j--; pesos[j+1]=indice; printf("\n****array ORDENADO****\n"); for (i=0;i<nest;i++) printf("peso[%d]: %.1f\n",i+1,pesos[i]); 11
12 Ejemplo de Salida: Ejemplo #4: Programa en C que permite introducir una lista con los pesos de los N estudiantes de la asignatura de Programación Estructurada e imprime los pesos ordenados de mayor a menor utilizando el método de inserción. //inserción.c #include<stdio.h> #include<stdlib.h> void main() float *pesos,indice; int i,j,nest,e; printf("cuantos estudiantes son?: "); scanf("%d",&nest); pesos = (float *) malloc(nest *sizeof(float)); if(pesos==null) printf("insuficiente Espacio de Memoria\n"); exit(-1); //Salir del Programa for (i=0; i<nest; i++) printf("peso del Estudiante[%d]: ",i+1); scanf("%f",&pesos[i]); 12
13 printf("\n****array ORIGINAL****\n"); for (i=0;i<nest;i++) printf("peso[%d]: %.1f\n",i+1,pesos[i]); //Ordenación del array a través del método de inserción for (e=1;e<nest;e++) indice = pesos[e]; j = e-1; while (j>=0 && pesos[j]<indice) pesos[j+1] = pesos[j]; j--; pesos[j+1]=indice; printf("\n****array ORDENADO****\n"); for (i = 0;i<nest;i++) printf("peso[%d]: %.1f\n",i+1,pesos[i]); Ejemplo de Salida: 13
14 1.6.1 ANÁLISIS DEL ALGORITMO: Estabilidad: Este algoritmo nunca intercambia registros con claves iguales. Por lo tanto es estable. Requerimientos de Memoria: Una variable adicional para realizar los intercambios. Tiempo de Ejecución: Para una lista de n elementos el ciclo externo se ejecuta n-1 veces. El ciclo interno se ejecuta como máximo una vez en la primera iteración, 2 veces en la segunda, 3 veces en la tercera, etc. Esto produce una complejidad O(n 2 ). Ventajas: 1 Fácil implementación. 2 Requerimientos mínimos de memoria. Desventajas: 1 Lento. 2 Realiza numerosas comparaciones. Este también es un algoritmo lento, pero puede ser de utilidad para listas que están ordenadas o semiordenadas, porque en ese caso realiza muy pocos desplazamientos. 1.7 ORDENAMIENTO POR EL MÉTODO DE QUICKSORT: El ordenamiento rápido (quicksort en inglés) es un algoritmo basado en la técnica de divide y vencerás. Esta es probablemente la técnica más rápida conocida. Fue desarrollada por Tony Hoare en La idea del algoritmo es simple, se basa en la división en particiones de la lista a ordenar, por lo que se puede considerar que aplica la técnica divide y vencerás. El método es, posiblemente, el más pequeño de código, más rápido, más elegante, más interesante y eficiente de los algoritmos de ordenación conocidos. El método se basa en dividir los n elementos de la lista a ordenar en dos partes o particiones separadas por un elemento: una partición izquierda, un elemento central denominado pivote o elemento de partición, y una partición derecha. La partición o división se hace de tal forma que todos los elementos de la primera sublista (partición izquierda) son menores que todos los elementos de la segunda sublista (partición derecha). Las dos sublistas se ordenan entonces independientemente. Para dividir la lista en particiones (sublistas) se elige uno de los elementos de la lista y se utiliza como pivote o elemento de partición. Si se elige una lista cualquiera con los elementos en orden aleatorio, se puede seleccionar cualquier elemento de la lista como pivote, por 14
15 ejemplo, el primer elemento de la lista. Si la lista tiene algún orden parcial conocido, se puede tomar otra decisión para el pivote. Idealmente, el pivote se debe elegir de modo que se divida la lista exactamente por la mitad, de acuerdo al tamaño relativo de las claves. Una vez que el pivote ha sido elegido, se utiliza para ordenar el resto de la lista en dos sublistas: una tiene todas las claves menores que el pivote y la otra, todos los elementos (claves) mayores que o iguales que el pivote (o al revés). Estas dos listas parciales se ordenan recursivamente utilizando el mismo algoritmo; es decir, se llama sucesivamente al propio algoritmo quicksort. La lista final ordenada se consigue concatenando la primera sublista, el pivote y la segunda lista, en ese orden, en una única lista. La primera etapa de quicksort es la división o «particionado» recursivo de la lista hasta que todas las sublistas constan de sólo un elemento. El algoritmo es éste: Recorres la lista simultáneamente 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 elemento de división y lista[j] sea menor los intercambias. Repites esto hasta que se crucen los índices. El punto en que se cruzan los índices es la posición adecuada para colocar el elemento de división, porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores (o habrían sido intercambiados). Al finalizar este procedimiento el elemento de división queda en una posición en que todos los elementos a su izquierda son menores que él, y los que están a su derecha son mayores. Código en C del algoritmo: Nombre Tipo Uso lista Cualquiera Lista a ordenar inf Entero Elemento inferior de la lista sup Entero Elemento superior de la lista elem_div El mismo que los elementos de la lista El elemento divisor temp El mismo que los elementos de la lista Para realizar los intercambios i Entero Contador por la izquierda j Entero Contador por la derechag cont Entero El ciclo continua mientras cont tenga el valor 1 15
16 Nombre Procedimiento: OrdRap Parámetros: lista a ordenar (lista) índice inferior (inf) índice superior (sup) // Inicialización de variables 1. elem_div = lista[sup]; 2. i = inf - 1; 3. j = sup; 4. cont = 1; // Verificamos que no se crucen los límites 5. if (inf >= sup) 6. retornar; // Clasificamos la sublista 7. while (cont) 8. while (lista[++i] < elem_div); 9. while (lista[--j] > elem_div); 10. if (i < j) 11. temp = lista[i]; 12. lista[i] = lista[j]; 13. lista[j] = temp; 14. else 15. cont = 0; // Copiamos el elemento de división en su posición final 16. temp = lista[i]; 17. lista[i] = lista[sup]; 18. lista[sup] = temp; // Aplicamos el procedimiento recursivamente a cada sublista 19. OrdRap (lista, inf, i - 1); 20. OrdRap (lista, i + 1, sup); LOS PASOS QUE SIGUE EL ALGORITMO QUICKSORT: 1. Seleccionar el elemento central de a[0:n-1] como pivote. 2. Dividir los elementos restantes en particiones izquierda y derecha, de modo que ningún elemento de la izquierda tenga una clave (valor) mayor que el pivote y que ningún elemento a la derecha tenga una clave más pequeña que la del pivote. 3. Ordenar la partición izquierda utilizando quicksort recursivamente. 4. Ordenar la partición derecha utilizando quicksort recursivamente. 5. La solución es partición izquierda seguida por el pivote y a continuación partición derecha. 16
17 Veamos con un ejemplo, cómo funciona el algoritmo: Supongamos el siguiente arreglo de enterosa a ordenarse en formato ascendente: int datos[7] = 5,3,7,6,2,1,4; Comenzamos con la lista completa. El elemento divisor será el 4: Comparamos con el 5 por la izquierda y el 1 por la derecha es mayor que cuatro y 1 es menor. Intercambiamos: Avanzamos por la izquierda y la derecha: es menor que 4: avanzamos por la izquierda. 2 es menor que 4: nos mantenemos ahí es mayor que 4 y 2 es menor: intercambiamos Avanzamos por ambos lados: En este momento termina el ciclo principal, porque los índices se cruzaron. Ahora intercambiamos lista[i] con lista[sup] (pasos 16-18): Aplicamos recursivamente a la sublista de la izquierda (índices 0-2). Tenemos lo siguiente: es menor que 2: avanzamos por la izquierda. 3 es mayor: avanzamos por la derecha. Como se intercambiaron los índices termina el ciclo. Se intercambia lista[i] con lista[sup]: Al llamar recursivamente para cada nueva sublista (lista[0]-lista[0] y lista[2]-lista[2]) se retorna sin hacer cambios (condición 5.).Para resumir te muestro cómo va quedando la lista: Segunda sublista: lista[4]-lista[6] Para cada nueva sublista se retorna sin hacer cambios (se cruzan los índices). Finalmente, al retornar de la primera llamada se tiene el arreglo ordenado:
18 1.7.2 ANÁLISIS DEL ALGORITMO: Estabilidad: No es estable. Requerimientos de Memoria: No requiere memoria adicional en su forma recursiva. En su forma iterativa la necesita para la pila. Tiempo de Ejecución: Caso promedio. La complejidad para dividir una lista de n es O(n). Cada sublista genera en promedio dos sublistas más de largo n/2. Por lo tanto la complejidad se define en forma recurrente como: f(1) = 1 f(n) = n + 2 f(n/2) La forma cerrada de esta expresión es: f(n) = n log 2 n Es decir, la complejidad es O(n log 2 n). El peor caso ocurre cuando la lista ya está ordenada, porque cada llamada genera sólo una sublista (todos los elementos son menores que el elemento de división). En este caso el rendimiento se degrada a O(n2). Con las optimizaciones mencionadas arriba puede evitarse este comportamiento. Ventajas: 1 Muy rápido 2 No requiere memoria adicional. Desventajas: 1 Implementación un poco más complicada. 2 Recursividad (utiliza muchos recursos). 3 Mucha diferencia entre el peor y el mejor caso. La mayoría de los problemas de rendimiento se pueden solucionar con las optimizaciones mencionadas arriba (al costo de complicar mucho más la implementación). Este es un algoritmo que puedes utilizar en la vida real. Es muy eficiente. En general será la mejor opción. NOTA: En conclusión, se suele recomendar que para listas pequeñas los métodos más eficientes son burbuja y selección; y para listas grandes, el quicksort. 18
19 Ejemplo #5: Programa en C que inicializa una lista con valores e imprime los dichos datos ordenados de menor a mayor utilizando el método de quicksort. Nota: Versión Array. /**********Ordencion Quicksort en formato Ascendente. Método recursivo****/ #include<stdio.h> #include<stdlib.h> void quicksort(int [], int, int); void main() int lista[] = 9,4,2,7,5,i,n_elementos; n_elementos = sizeof(lista)/sizeof(int); printf ("******ARRAY ORIGINAL******\n \n"); for (i = 0; i < n_elementos; i++) printf("%d ",lista[i]); quicksort(lista,0,n_elementos-1); printf ("\n\narray ORDENADO EN FORMATO ASCENDENTE: \n"); printf (" \n"); for (i = 0; i < n_elementos; i++) printf("%d ",lista[i]); //Función Quicksort en formato ascendente void quicksort(int lista[], int inf, int sup) int mitad, x,izq, der; izq = inf; der = sup; mitad = lista[(izq + der)/2]; do while(lista[izq] < mitad && izq < sup) izq++; while(mitad < lista[der] && der > inf) der--; if(izq <= der) x = lista[izq], lista[izq] = lista[der], lista[der] = x; izq++; der--; 19
20 while(izq <= der); if(inf<der) quicksort(lista, inf,der); //mismo proceso con sublista izqda if(izq<sup) quicksort(lista,izq,sup); //mismo proceso con sublista derecha Ejemplo de Salida: Ejemplo #6: Programa en C que inicializa una lista con valores e imprime los dichos datos ordenados de mayor a menor utilizando el método de quicksort. Nota: Versión Array. /************* Ordencion Quicksort Descendente. Método recursivo***************/ #include<stdio.h> #include<stdlib.h> void quicksort(int [], int, int); void main() int lista[] = 9,4,2,7,5,i,n_elementos; n_elementos = sizeof(lista)/sizeof(int); printf ("******ARRAY ORIGINAL******\n \n"); for (i = 0; i < n_elementos; i++) printf("%d ",lista[i]); quicksort(lista,0,n_elementos-1); printf ("\n\narray ORDENADO EN FORMATO ASCENDENTE: \n"); printf (" \n"); for (i = 0; i < n_elementos; i++) printf("%d ",lista[i]); 20
21 /////////////Quicksort Descendente//////////////////////// void quicksort(int lista[], int inf, int sup) int mitad, x,izq, der; izq = inf; der = sup; mitad = lista[(izq + der)/2]; do while(lista[izq] > mitad && izq < sup) izq++; while(mitad > lista[der] && der > inf) der--; if(izq <= der) x = lista[izq], lista[izq] = lista[der], lista[der] = x; izq++; der--; while(izq <= der); Algoritmos de Ordenación y Búsqueda en C if(inf<der) quicksort(lista, inf,der); //mismo proceso con sublista izqda if(izq<sup) quicksort(lista,izq,sup); //mismo proceso con sublista derecha Ejemplo de Salida: 21
22 Ejemplo #7: Programa en C que inicializa una lista con valores e imprime los dichos datos ordenados de menor a mayor utilizando el método de quicksort. Nota: Versión Punteros. //metodo_quicksort.c #include<stdio.h> #include<stdlib.h> void quicksort(int *izq, int *der); void Intercambio(int *a, int *b); void main() int lista[]=9,4,2,7,5; int i,nelem; nelem= sizeof(lista)/sizeof(int); printf("\n****array ORIGINAL****\n"); for (i=0;i<nelem;i++) printf("elemento[%d]: %d\n",i+1,lista[i]); /*Se llama con: quicksort(&vector[0],&vector[n-1]);*/ quicksort(&lista[0],&lista[nelem-1]); printf("\n****array ORDENADO****\n"); for (i=0;i<nelem;i++) printf("elemento[%d]: %d\n",i+1,lista[i]); //Ordenación del array a través del método de quicksort void quicksort(int *izq, int *der) if(der < izq) return; int pivot = *izq; int *ult = der; int *pri = izq; while(izq<der) while(*izq <= pivot && izq < (der+1)) izq++; while(*der > pivot && der > (izq-1)) der--; 22
23 if( izq < der) Intercambio(izq,der); Intercambio(pri,der); quicksort(pri,der-1); quicksort(der+1,ult); void Intercambio(int* a, int* b) int temp = *a; *a = *b; *b = temp; Ejemplo de Salida: 1.8 BÚSQUEDA DE DATOS: Con mucha frecuencia los programadores trabajan con grandes cantidades de datos almacenados en arrays y registros, y por ello será necesario determinar si un array contiene un valor que coincida con un cierto valor clave. El proceso de encontrar un elemento específico de un array se denomina búsqueda. En esta sección se examinarán dos técnicas de búsqueda: búsqueda lineal o secuencial, la técnica más sencilla, y búsqueda binaria o dicotómica, la técnica más eficiente BÚSQUEDA SECUENCIAL: La búsqueda secuencial busca un elemento de una lista utilizando un valor destino llamado clave. En una búsqueda secuencial (a veces llamada búsqueda lineal), los elementos de una lista o vector se exploran (se examinan) en secuencia, uno después de otro. 23
24 La búsqueda secuencial es necesaria, por ejemplo, si se desea encontrar la persona cuyo número de teléfono es en un directorio o listado telefónico de su ciudad. Los directorios de teléfonos están organizados alfabéticamente por el nombre del abonado en lugar de por números de teléfono, de modo que deben explorarse todos los números, uno después de otro, esperando encontrar el número. El algoritmo de búsqueda secuencial compara cada elemento del array con la clave de búsqueda. Dado que el array no está en un orden prefijado, es probable que el elemento a buscar pueda ser el primer elemento, el último elemento o cualquier otro. De promedio, al menos el programa tendrá que comparar la clave de búsqueda con la mitad de los elementos del array. El método de búsqueda lineal funcionará bien con arrays pequeños o no ordenados. La eficiencia de la búsqueda secuencial es pobre, tiene complejidad lineal, O(n). El pseudocódigo puede ser: <función búsqueda_s(array a, valor que queremos buscar)> i=0 DO WHILE(no encontrado) IF(valor = a[i]) encontrado ENDIF i = i + 1 ENDDO END<Busqueda_S> Ejemplo #8: Programa en C que implementa la búsqueda secuencial de un elemento determinado dentro de un array de N elementos. //busqueda_secuencial.c #include<stdio.h> #include<stdlib.h> #include<conio.h> int BusquedaSecuencial(int *parray,int buscar,int nelem); void main() int *pdatos, nelem, dbuscar,d,result; printf("cuantos elementos desea en el array? "); scanf("%d",&nelem); 24
25 pdatos= (int *) malloc(nelem * sizeof(int)); if(pdatos==null) printf("insuficiente Espacio de Memoria"); exit(-1); for(d=0; d < nelem;d++) printf("elemento[%d]: ",d); scanf("%d",(pdatos+d)); printf("\nque elemento desea buscar?"); scanf("%d",&dbuscar); //Llamada a la Función que realiza la búsqueda result = BusquedaSecuencial(pdatos,dbuscar,nelem); if (result!= -1) printf ("\n%d SE ENCUENTRA EN LA POSICION %d DEL ARRAY\n",dbuscar, result); else printf ("\n %d NO SE ENCUENTRO\n",dbuscar); int BusquedaSecuencial(int *parray,int buscar,int elem) int i; for (i=0; i<elem; i++) if (*(parray+i) == buscar) return (i); // Retornamos el índice del valor encontrado return (-1); 25
26 Ejemplo de Salida: BÚSQUEDA BINARIA: La búsqueda secuencial se aplica a cualquier lista. Si la lista está ordenada, la búsqueda binaria proporciona una técnica de búsqueda mejorada. Una búsqueda binaria típica es la búsqueda de una palabra en un diccionario. Dada la palabra, se abre el libro cerca del principio, del centro o del final dependiendo de la primera letra del primer apellido o de la palabra que busca. Se puede tener suerte y acertar con la página correcta; pero, normalmente, no será así y se mueve el lector a la página anterior o posterior del libro. Por ejemplo, si la palabra comienza con «J» y se está en la «L» se mueve uno hacia atrás. El proceso continúa hasta que se encuentra la página buscada o hasta que se descubre que la palabra no está en la lista. Se selecciona el elemento del centro o aproximadamente del centro del array. Si el valor a buscar no coincide con el elemento seleccionado y es mayor que él, se continúa la búsqueda en la segunda mitad del array. Si, por el contrario, el valor a buscar es menor que el valor del elemento seleccionado, la búsqueda continúa en la primera parte del array. En ambos casos, se halla de nuevo el elemento central, correspondiente al nuevo intervalo de búsqueda, repitiéndose el ciclo. El proceso se repite hasta que se encuentra el valor a buscar, o bien hasta que el intervalo de búsqueda sea nulo, lo que querrá decir que el elemento buscado no figura en el array. Ejemplo #9: Programa en C que implementa la búsqueda binaria de un elemento determinado dentro de un array de N elementos. //busqueda_binaria.c #include<stdio.h> #include<stdlib.h> #include<conio.h> int BusquedaBinaria(int datos[], int nelem, int clave); 26
27 void main() int *pdatos, nelem, dbuscar,d,result; printf("cuantos elementos desea en el array? "); scanf("%d",&nelem); pdatos= (int *) malloc(nelem * sizeof(int)); if(pdatos==null) printf("insuficiente Espacio de Memoria"); exit(-1); for(d=0; d < nelem;d++) printf("elemento[%d]: ",d); scanf("%d",(pdatos+d)); printf("\nque elemento desea buscar?"); scanf("%d",&dbuscar); //Llamada a la Función que realiza la búsqueda result = BusquedaBinaria(pdatos,nelem,dbuscar); if (result!= -1) printf ("\n%d SE ENCUENTRA EN LA POSICION %d DEL ARRAY\n",dbuscar,result); else printf ("\n %d NO SE ENCUENTRO\n",dbuscar); int BusquedaBinaria(int lista[], int n, int clave) int central, bajo, alto; int valorcentral; bajo = 0; alto = n-1; while (bajo <= alto) central = (bajo+alto)/2; /* índice de elemento central */ valorcentral = lista[central]; /* valor del índice central */ if (clave == valorcentral) return (central); /* encontrado, devuelve posición */ 27
28 else if (clave < valorcentral) alto = central-1; /* ir a sublista inferior */ else bajo = central+1; /* ir a sublista superior */ return (-1); /* elemento no encontrado */ Ejemplo #9.1: Programa en C que implementa la búsqueda binaria de un elemento determinado dentro de un array (ordenado en formato ascendente) de N elementos. //busqueda_binaria.c #include<stdio.h> #include<stdlib.h> #include<conio.h> int BusquedaBinaria(int datos[], int nelem, int clave); void OrdenarBurbuja (int datos[],int nelem) int i,j,temp; for (i=0;i<nelem;i++) for(j=0;j<(nelem-1);j++) if(datos[j] > datos[j+1]) temp=datos[j]; datos[j] = datos[j+1]; datos[j+1] = temp; void main() int *pdatos, nelem, dbuscar,d,result; printf("cuantos elementos desea en el array? "); scanf("%d",&nelem); pdatos= (int *) malloc(nelem * sizeof(int)); if(pdatos==null) printf("insuficiente Espacio de Memoria"); exit(-1); 28
29 for(d=0; d < nelem;d++) printf("elemento[%d]: ",d); scanf("%d",(pdatos+d)); OrdenarBurbuja(pdatos,nelem); printf("\nque elemento desea buscar?"); scanf("%d",&dbuscar); //Llamada a la Función que realiza la búsqueda result = BusquedaBinaria(pdatos,nelem,dbuscar); if (result!= -1) printf ("\n%d SE ENCUENTRA EN LA POSICION %d DEL ARRAY\n",dbuscar,result); else printf ("\n %d NO SE ENCUENTRO\n",dbuscar); int BusquedaBinaria(int lista[], int n, int clave) int central, bajo, alto; int valorcentral; bajo = 0; alto = n-1; while (bajo <= alto) central = (bajo+alto)/2; //índice de elemento central valorcentral = lista[central]; // valor del índice central if (clave == valorcentral) return (central); //encontrado, devuelve posición else if (clave < valorcentral) alto = central-1; //ir a sublista inferior else bajo = central+1; //ir a sublista superior return (-1); //elemento no encontrado 29
30 EJERCICIOS PROPUESTOS: Algoritmos de Ordenación y Búsqueda en C 1. Partiendo del siguiente array encuentre el número de pasadas que realiza el algoritmo de ordenación de burbuja para su ordenación. 2. Un vector contiene los elementos mostrados a continuación. Los primeros dos elementos se han ordenado utilizando un algoritmo de inserción. Cuál será el valor de los elementos del vector después de tres pasadas más del algoritmo? 3. Partiendo del siguiente array encuentre las particiones e intercambios que realiza el algoritmo de ordenación quicksort para su ordenación. 4. Realice un programa que permita ordenar de menor a mayor o de mayor a menor un array con los sueldos de los N empleados de una empresa por cualquiera de los algoritmos de ordenación estudiados. 30
ALGORITMOS DE ORDENACIÓN Y BÚSQUEDA EN C
2010 UNAN LEON Departamento de Computación Ing. En Sistemas de Información Autor: Ing: Karina Esquivel Alvarado. Asignatura: Algoritmo y Estructura de Datos. ALGORITMOS DE ORDENACIÓN Y BÚSQUEDA EN C TEMA
Antes de comenzar a ver cada algoritmo vamos a ponernos de acuerdo en algunos conceptos, para que no haya confusiones:
1. Introducción. El ordenamiento es una labor común que realizamos continuamente. Pero te has preguntado qué es ordenar? No? Es que es algo tan corriente en nuestras vidas que no nos detenemos a pensar
Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero
Universidad de Valladolid Departamento de informática Campus de Segovia Estructura de datos Tema 4: Ordenación Prof. Montserrat Serrano Montero ÍNDICE Conceptos básicos Elección de un método Métodos directos
Este método se basa en buscar el elemento menor el vector y colocarlo en la primera
Lectura ORDENACIÓN DE ARREGLOS Con frecuencia se requiere clasificar u ordenar los elementos de un vector (arreglo unidimensional) en algún orden en particular. Por ejemplo, ordenar un conjunto de números
CAPITULO II ORDENAMIENTO Y BUSQUEDA. Ivan Medrano Valencia
CAPITULO II ORDENAMIENTO Y BUSQUEDA Ivan Medrano Valencia ORDENACIÓN La ordenación o clasificación de datos (sort en inglés) es una operación consistente en disponer un conjunto estructura de datos en
Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos
Estructura de Datos y Algoritmos Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos 1. Algorimos de ordenación Discutiremos el problema de ordenar un array de elementos. A los efectos de simplificar
Capítulo. Algoritmos de ordenación y búsqueda. Contenido. Introducción
Capítulo 9 Algoritmos de ordenación y búsqueda Contenido Ordenación Ordenación por burbuja Ordenación por selección Ordenación por inserción Ordenación Shell Ordenación rápida ( quicksort) Búsqueda en
<tipo> Tipo de dato de los elementos del vector
Vectores y matrices Declaración Vector (array unidimiensional): []; Tipo de dato de los elementos del vector Identificador de la variable.
Métodos de ordenamiento y búsqueda en vectores
Métodos de ordenamiento y búsqueda en vectores Ordenación (clasificación) Es la operación de organizar un conjunto de datos en algún orden o secuencia específica, tal como creciente o decreciente para
ORDENAMIENTO Y BÚSQUEDA EN ARREGLOS
1 ORDENAMIENTO Y BÚSQUEDA EN ARREGLOS Corina Flores Villarroel ORDENAMIENTO EN ARREGLOS Y COLECCIONES Una de las tareas más comunes a la hora de procesar datos es la clasificación u ordenación de los datos.
NOTAS(1) NOTAS(2)... NOTAS(I)... NOTAS(N)
TRABAJO DE INVESTIGACIÓN ARREGLOS, MATRICES Y ARCHIVOS 1. ARREGLOS Y MATRICES Un array (matriz o vector) es un conjunto finito y ordenado de elementos homogéneos. La propiedad ordenado significa que el
Estructuras de Datos y Algoritmos
Estructuras de Datos y Algoritmos Prof. Dr. P. Javier Herrera Contenido 1 Conceptos básicos de grafos y su especificación algebraica 2 Algoritmos de ordenación 3 Algoritmos de búsqueda 2 1. Grafos Estructuras
Algoritmos de Ordenación
Algoritmos de Ordenación Pedro Corcuera Dpto. Matemática Aplicada y Ciencias de la Computación Universidad de Cantabria corcuerp@unican.es Algoritmos comunes - Ordenación Ordenación o clasificación es
TEMA 7. ALGORITMOS DE BÚSQUEDA, ORDENACIÓN
M.P. Sesmero, P. de Toledo, F.J. Ordoñez, J. Gómez-Romero, J.A. Iglesias, J.L. Mira Programación TEMA 7. ALGORITMOS DE BÚSQUEDA, ORDENACIÓN Y MEZCLA Grado en Ingeniería en Tecnologías Industriales Programación
Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas
Tema 9 Algoritmos sobre listas Programación 2015-2016 Programación - Tema 9: Algoritmos sobre listas 1 Tema 9. Algoritmos sobre listas Algoritmos sobre Arrays. Búsqueda. Inserción. Ordenación. Programación
Algoritmos sobre Listas
TEMA 6 Algoritmos sobre Listas V1.1 Manuel Pereira González Agenda Introducción Algoritmos de Búsqueda Búsqueda Secuencial Búsqueda Binaria Análisis de Eficiencia Algoritmos de Inserción Algoritmos de
Métodos de ordenamiento:
Métodos de ordenamiento: 0) Intercambio: a) Idea: El algoritmo de intercambio aunque es el más sencillo de implementar es uno de los más ineficientes en rendimiento. Se basa en la idea de buscar cada vez
ESTRUCTURA DE DATOS: Tema 5. Ordenamiento y Búsqueda
ESTRUCTURA DE DATOS: Tema 5. Ordenamiento y Búsqueda Presenta: David Martínez Torres Universidad Tecnológica de la Mixteca Instituto de Computación Oficina No. 37 dtorres@mixteco.utm.mx Contenido 1. Ordenamiento
Recursividad. Dept. Ciencias de la Computación e I.A. Universidad de Granada
TEMA Recursividad Dept. Ciencias de la Computación e I.A. Universidad de Granada Índice Introducción a la recursión Recursividad frente a iteración Eficiencia de los algoritmos recursivos Ejemplos y ejercicios
Métodos de ordenamiento:
Métodos de ordenamiento: 0) Intercambio: a) Idea: El algoritmo de intercambio aunque es el más sencillo de implementar es uno de los más ineficientes en rendimiento. Se basa en la idea de buscar cada vez
Métodos de ordenamiento y búsqueda para datos en memoria principal
Métodos de ordenamiento y búsqueda para datos en memoria principal Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile fguidi@ucv.cl Ordenamiento
Métodos de ordenamiento y búsqueda para datos en memoria principal
Ordenamiento Métodos de ordenamiento y búsqueda para datos en memoria principal Dada una colección que contiene un número elementos, el ordenamiento es el proceso de reacomodar un conjunto de elementos
Guía práctica de estudio 4 Algoritmos de búsqueda parte 1
Guía práctica de estudio 4 Algoritmos de búsqueda parte 1 Elaborado por: Revisión: Ing. Laura Sandoval Montaño Facultad de Ingeniería U.N.A.M. Guía Práctica 4 Estructura de datos y Algoritmos II Algoritmos
Objetivos. Conocer y saber utilizar diferentes tipos de datos. estructurados: cómo se definen. cómo están organizadas sus componentes
Objetivos Conocer y saber utilizar diferentes tipos de datos estructurados: cómo se definen cómo están organizadas sus componentes cómo se accede a ellas y sus operaciones y algoritmos básicos Tema: Estructuras
PROGRAMACIÓN ESTRUCTURADA
Universidad Nacional de Jujuy PROGRAMACIÓN ESTRUCTURADA Trabajo Práctico Nº 11 Tema: Operaciones sobre Arreglos. Ordenación. Apellido y Nombre: Fecha: / / Conceptos Teóricos ORDENACIÓN DE ARREGLOS Los
Esquema de Dividir y Vencer
Esquema de Dividir y Vencer Amalia Duch Barcelona, marzo de 2006 Índice 1. Esquema general 1 2. Búsqueda binaria (binary search) 2 3. Ordenación por fusión (merge sort) 2 4. Ordenación rápida (quick sort)
Curso de Programación 1
Curso de Programación 1 Plan 97 Búsqueda y Ordenación Métodos de búsqueda Existen aplicaciones en las cuales es necesario consultar si un elemento se encuentra dentro de un array. A continuación veremos
Ordenamiento y Búsqueda
Ordenamiento y Búsqueda Facultad de Ciencias de la Computación Juan Carlos Conde R. Object-Oriented Programming I Contenido 1 Introducción 2 Intercambio directo 3 Inserción directa 4 Selección directa
Métodos de Ordenamiento. Unidad VI: Estructura de datos
Métodos de Ordenamiento Unidad VI: Estructura de datos Concepto de ordenación La ordenación de los datos consiste en disponer o clasificar un conjunto de datos (o una estructura) en algún determinado orden
7.1 Consideraciones. Considere la búsqueda de un libro en una biblioteca. Considere la búsqueda de un nombre en el directorio telefónico.
86 Capítulo 7. ORDENAMIENTO. 7.1 Consideraciones. Considere la búsqueda de un libro en una biblioteca. Considere la búsqueda de un nombre en el directorio telefónico. Si los elementos a ordenar son compuestos
Soluciones a los ejercicios planteados en el curso
Soluciones a los ejercicios planteados en el curso Unidad 3 - Algoritmos recursivos Lección 2 Mecanismo de recursividad Escribe un algoritmo recursivo que calcule el elemento de cardinal más elevado de
Algoritmos Recursivos de Búsqueda y Ordenación y sus tiempos
Estructura de Datos y Algoritmos Algoritmos Recursivos de Búsqueda y Ordenación y sus tiempos 1. Algoritmos de ordenación recursivos 1.1. Mergesort, Ordenamiento por fusión Mergesort se ejecuta en un tiempo
QUICKSORT JAMES GUARIN CARO JAHIR ARDILA GERMAN ORTEGON DAVID GOMEZ UNIVERSIDAD PILOTO DE COLOMBIA INGENIERIA DE SISTEMAS BOGOTA 2010
QUICKSORT JAMES GUARIN CARO JAHIR ARDILA GERMAN ORTEGON DAVID GOMEZ UNIVERSIDAD PILOTO DE COLOMBIA INGENIERIA DE SISTEMAS BOGOTA 2010 1 TABLA DE CONTENIDO 1. Descripción 2. Pseudocódigo 3. Optimizado 4.
Introducción Supongamos un subconjunto de n elementos X = {e 1,,e n de un conjunto referencial Y, X Y. Dentro de Y se define una relación de orden tot
Algoritmos de ordenación Análisis y Diseño de Algoritmos Algoritmos de ordenación Algoritmos básicos: Θ(n 2 ) Ordenación por inserción Ordenación por selección Ordenación por intercambio directo (burbuja)
Métodos de Ordenamiento
Métodos de Ordenamiento Muchas veces es necesario además de buscar elementos dentro de en un vector, ordenarlos. El ordenamiento puede ser de mayor a menor si se están manejando números y en orden alfabético
Tema 9. Recursividad
Tema 9. Recursividad http://aulavirtual.uji.es José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz {badia, bmartine, morales, sanchiz@icc.uji.es Estructuras de datos y de la información Universitat
11-Ordenar Definiciones 11.2 Selección 11.3 Intercambio 11.4 Inserción 11.5 Shellsort 11.6 Quicksort 11.7 Mergesort.
11-Ordenar 11.1 Definiciones 11.2 Selección 11.3 Intercambio 11.4 Inserción 11.5 Shellsort 11.6 Quicksort 11.7 Mergesort 11: Ordenar 2 Definiciones Se desea ordenar un set de estructuras, que contienen
Árboles. Árboles. Árboles binarios de búsqueda. Árboles. Inserción en un árbol. Árbol binario de búsqueda
Árboles Árboles Mario Medina C. mariomedina@udec.cl Árboles Estructura recursiva Árbol vacío 0 o más árboles hijos Altura ilimitada Árbol binario A lo más dos hijos: izquierdo y derecho Árboles Árboles
dit UPM Tema 2: Algoritmos /ordenación /java Análisis y diseño de software José A. Mañas
Análisis y diseño de software dit UPM Tema 2: Algoritmos /ordenación /java José A. Mañas http://jungla.dit.upm.es/~pepe/doc/adsw/index.html 23.2.2018 objetivos algoritmos de ordenación conocer nombres
Algorítmica y Complejidad. Tema 3 Ordenación.
Algorítmica y Complejidad Tema . Introducción.. Algoritmo de inserción.. Algoritmo de selección.. Algoritmo de la burbuja.. Algoritmo heapsort.. Algoritmo quicksort. 7. Algoritmo countingsort.. Algoritmo
Francisco J. Hernández López
Francisco J. Hernández López fcoj23@cimat.mx Acomodar algo en alguna secuencia especifica Objetos ordenados: Directorio telefónicos Registro de pacientes Libros en una biblioteca Cosas del hogar Se puede
Programación I (Plan 1999) Algoritmos y Estructuras de Datos II (Plan 2009) Mgter. Oscar Adolfo Vallejos FaCENA - UNNE
Unidad 3: Eficiencia de Algoritmos Tema V: Búsqueda. Búsqueda. Búsqueda Lineal. Búsqueda binaria. Búsqueda Máximos y Mínimos. Análisis de los algoritmos de búsqueda. Programación I (Plan 1999) Algoritmos
5 Métodos de Ordenamiento. 5.1 Métodos de Ordenamiento Internos Burbuja Quicksort Heapsort Inserción Simple 5.1.
5 Métodos de Ordenamiento 5.1 Métodos de Ordenamiento Internos 5.1.1 Burbuja 5.1.2 Quicksort 5.1.3 Heapsort 5.1.4 Inserción Simple 5.1.5 Shellsort 5 Métodos de Ordenamiento 5.1 Ordenamiento Interno 5.1
Tema: Métodos de Ordenamiento. Parte 1.
Programación IV. Guía 2. 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV Tema: Métodos de Ordenamiento. Parte 1. Objetivos Específicos Identificar la estructura de algunos algoritmos
Recursividad. 1.1 Concepto de Recursividad. Objetivos. Metodología de la Programación II Entender el concepto de recursividad.
Objetivos Metodología de la Programación II Entender el concepto de recursividad. Conocer los fundamentos del diseño de algoritmos recursivos. Recursividad Comprender la ejecución de algoritmos recursivos.
Tema 3. Análisis de costes
Tema 3. Análisis de costes http://aulavirtual.uji.es José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz {badia, bmartine, morales, sanchiz}@icc.uji.es Estructuras de datos y de la información
Algoritmos de Ordenamiento
Algoritmos de Ordenamiento mat-151 Alonso Ramírez Manzanares Computación y Algoritmos 12.04 Algoritmos de ordenamiento Entrada: secuencia de números. Salida: permutación
Estructura de datos y de la información Boletín de problemas - Tema 9
Estructura de datos y de la información Boletín de problemas - Tema 9 1. Dada la siguiente función recursiva: void F(char c) { if (( A
Algoritmos de Ordenamiento
Algoritmos de Ordenamiento Fernando A. Lagos B. Copyleft 2007 INDICE 1 Introducción Pág. 3 2 Tipos de Algoritmos Pág. 4 2.1 Algoritmos iterativos Pág. 5 2.2 Algoritmos recursivos Pág. 6 3 Método de la
Ordenamiento (Sorting)
Ordenamiento (Sorting) El problema del ordenamiento Ordenar: arreglo[α] arreglo[α], donde α es un tipo tal que está definida la relación < α Uno de los problemas más clásicos, útiles y estudiados de la
Arreglos. Donde en cada posición del array se puede guardar un elemento. tipo_dato nombre_array[cant_elem];
Arreglos Los arreglos o arrays son colecciones de datos del mismo tipo. De esta manera, podemos encontrar arrays de números enteros, arrays de números double, arrays de caracteres. Tradicionalmente, la
Tema: Métodos de Ordenamiento. Parte 3.
Programación IV. Guía 4 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV Tema: Métodos de Ordenamiento. Parte 3. Objetivos Específicos Identificar la estructura de algunos algoritmos
Concepto de Recursión. Características de algoritmos recursivos. Ejemplos
RECURSION Temario Concepto de Recursión Características de algoritmos recursivos Ejemplos RECURSION Metodologías para resolver problemas: 1. Diseño Top Down 2. Recursión 3. Abstracción de Datos 4. Diseño
8. Vectores (arrays)
8. Vectores (arrays) Fundamentos de Informática Especialidad de Electrónica 2009-2010 Ismael Etxeberria Agiriano 16/12/2009 Índice 8. Vectores (arrays) 1. Números aleatorios 2. Serie ordenada 3. Números
Universidad Autónoma del Estado de Hidalgo Instituto de Ciencias Básicas e Ingeniería Área Académica de Computación y Electrónica
Universidad Autónoma del Estado de Hidalgo Instituto de Ciencias Básicas e Ingeniería Área Académica de Computación y Electrónica Licenciatura en Sistemas Computacionales Estructura de Datos II Docente:
TEMA. Vectores y Matrices. Dept. Ciencias de la Computación e I.A. Universidad de Granada
TEMA Vectores y Matrices Dept. Ciencias de la Computación e I.A. Universidad de Granada 1 VECTORES Y MATRICES Motivación. Operaciones Básicas. Paso de vectores como parámetros. Búsqueda y Ordenación. Matrices.
Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos
Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos 1! 1. Algoritmos recursivos " 1.1 Algoritmos recursivos. Recursión simple " 1.2 Algoritmos con vuelta atrás y ejemplos! 2. Complejidad de
Fundamentos de la programación
Fundamentos de la programación 7 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Facultad de Informática Universidad Complutense Algoritmos de ordenación
Arreglos Estructura (struct)
Universidad Rafael Urdaneta Escuela de Ingeniería de Computación Arreglos Estructura (struct) MSc Jaime Soto Una estructura de datos es una colección de datos que pueden ser caracterizados por su organización
Tema 3. Estructuras de control
Tema 3. Estructuras de control 3.1. Secuencial 3.2. Selección 3.3. Repetición 2 Objetivos Objetivos del tema: Conocer y saber la utilidad de las tres estructuras de control (secuencial, alternativa y repetitiva)
Tema: Métodos de Ordenamiento. Parte 3.
Programación IV. Guía No. 5 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV Tema: Métodos de Ordenamiento. Parte 3. Objetivos Específicos Identificar la estructura de algunos algoritmos
ALGORITMOS Y PROGRAMACIÓN I Unidad 3
ALGORITMOS Y PROGRAMACIÓN I Unidad 3 Tipos de Datos Estructurados Prof. Jaime Soto Sección (007) Material original de Prof. AURELY LEAL Introducción a las Estructuras de Datos Una estructura de datos es
Ordenamiento en Tiempo Lineal - Medianas y Ordenes sticas
Ordenamiento en Tiempo Lineal - Medianas y Ordenes Estadísticas sticas CLASIFICACIÓN EN TIEMPO LINEAL. 1.- Cota Inferior para Ordenamiento por comparaciones. -árbol de decisión. - limite inferior para
Eduardo Andrés Medina Ramírez Angel Robles Pérez MÉTODO DE ORDENAMIENTO QUICKSORT
Eduardo Andrés Medina Ramírez Angel Robles Pérez MÉTODO DE ORDENAMIENTO QUICKSORT QUÉ ES QUICKSORT? HISTORIA DEL MÉTODO QUICKSORT El método Quicksort fue ideado por el científico inglés Charles Anthony
Apunte de cátedra: Ordenación de Arreglos
Facultad de Ciencias Exactas, Ingeniería y Agrimensura (U.N.R.) Escuela de Ciencias Exactas y Naturales Departamento de Matemática Cátedra: Computación (L.M. - P.M.) Prof. responsable: Mgr. María del Carmen
PROGRAMACIÓN ESTRUCTURADA
FACULTAD DE INGENIERÍA Universidad Nacional de Jujuy PROGRAMACIÓN ESTRUCTURADA Trabajo Práctico Nº 10 Tema: Arreglos. Actualización y Búsqueda Apellido y Nombre: Fecha: / / Conceptos Teóricos RESPONDA
Divide & Conquer. Herman Schinca. Clase de Junio de 2011
Divide & Conquer Herman Schinca Clase 20 7 de Junio de 2011 Divide y vencerás Idea aplicable a muchas situaciones de la vida. Origen histórico atribuído a Julio César en relación a sus estrategias militares.
Práctica 5.- Recursividad
Benemérita Universidad Autónoma de Puebla Facultad de Ciencias de la Computación Programación Avanzada en Java Prim. 2009 Práctica 5.- Recursividad Datos de la práctica Fecha 6 de marzo de 2009 Conceptos
Tema 2.- Ordenación (Parte I)
En la elaboración de estos apuntes han participado los siguientes alumnos: Helena Hernández Obregón (Curso 200/2002), Eduardo Quevedo, Raquel González y Aarón Asencio (Curso 2003/200). Actualizado por
Ordenamiento Avanzado: Shellshort y Quicksort
October 1, 2009 1 2 3 4 Acerca del ordenamiento sencillo... Los métodos de ordenamiento sencillo que vimos anteriormente son relativamente fácil de implementar. A expensas de la facilidad de implementarlos
Algoritmos de Búsqueda
Introducción a la Computación Algoritmos de Búsqueda Esteban E. Mocskos (emocskos@dc.uba.ar) Facultad de Ciencias Exactas y Naturales, UBA CONICET 11/10/2017 E. Mocskos (UBA CONICET) Algoritmos de Búsqueda
UNIDAD 7 Recursividad Concepto. Algoritmos recursivos. Seguimiento de la recursión. Algunos métodos recursivos de búsqueda y ordenación: M-Sort y
Recursividad Concepto. Algoritmos recursivos. Seguimiento de la recursión. Algunos métodos recursivos de búsqueda y ordenación: M-Sort y Q-Sort. Comparación de eficiencia en métodos Iterativos vs recursivos
Algorítmica y Lenguajes de Programación. Ordenación (ii) En la lección anterior se vieron dos métodos de ordenación:
Algorítmica y Lenguajes de Programación Ordenación (ii) Ordenación. Introducción En la lección anterior se vieron dos métodos de ordenación: Método de la burbuja. Método de la burbuja con señal. El primero
Vectores y Matrices. Dept. Ciencias de la Computación e I.A. Universidad de Granada
TEMA Vectores y Matrices Dept. Ciencias de la Computación e I.A. Universidad de Granada 1 VECTORES Y MATRICES Motivación. Operaciones Básicas. Ejemplos Paso de vectores como parámetros. Matrices Ejemplos
Programación II Práctica 03: Recursividad Versión del 10/08/2016
Programación II Práctica 03: Recursividad Versión del 10/08/2016 Como vimos en clase un algoritmo recursivo es un algoritmo que expresa la solución de un problema en términos de una llamada a sí mismo.
Búsqueda y ordenamiento
16 Búsqueda y ordenamiento Con sollozos y lágrimas él sorteó Los de mayor tamaño Lewis Carroll Intenta el final, y nunca dejes lugar a dudas; No hay nada tan difícil que no pueda averiguarse mediante la
Tema: Métodos de Ordenamiento. Parte 1.
Programación IV. Guía No. 3 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV Tema: Métodos de Ordenamiento. Parte 1. Objetivos Específicos Identificar la estructura de algunos algoritmos
Estructuras de Datos II
Estructuras de Datos II Segundo Parcial Los árboles B+ son estructuras de datos jerárquicas que se utilizan para almacenar y manipular datos ordenados de forma muy eficiente, ya que por su estructura y
Algoritmos de ordenación básicos
Algoritmos de ordenación básicos por Iván Cruz Cuando tratamos de resolver algunos problemas haciendo uso de la programación estructurada, en ocasiones es necesario poder ordenar un conjunto de datos.
Algorítmica y Lenguajes de Programación. Búsqueda
Algorítmica y Lenguajes de Programación Búsqueda Búsqueda. Introducción Hace dos lecciones se dijo que había tres tratamientos básicos sobre vectores: Recorrido. Ordenación. Búsqueda. Durante las últimas
Dividir-conquistar y podar-buscar
Técnicas de diseño de algoritmos Dividir-conquistar y podar-buscar Dra. Elisa Schaeffer elisa.schaeffer@gmail.com PISIS / FIME / UANL DC y PB p. 1 Diseño de algoritmos La meta: encontrar una manera eficiente
Estructura de Datos. Temario Unidad VI. Árboles Árboles Binarios
Estructura de Datos Árboles Árboles Binarios Temario Unidad VI 6.1 Definición y operaciones 6.2 Implementación 6.3 Recorrido en Árboles Binarios 6.4 Árboles AVL y su implementación 6.5 Árboles n-arios
Técnicas de diseño de algoritmos Divide y Vencerás
Técnicas de diseño de algoritmos Divide y Vencerás Luis Javier Rodríguez Fuentes Amparo Varona Fernández Departamento de Electricidad y Electrónica Facultad de Ciencia y Tecnología, UPV/EHU luisjavier.rodriguez@ehu.es
ARBOLES B. Lo que si es cierto es que la letra B no significa "binario", ya que:
ARBOLES B El problema original comienza con la necesidad de mantener índices en almacenamiento externo para acceso a bases de datos, es decir, con el grave problema de la lentitud de estos dispositivos
Unidad 2: Estructuras de Datos estáticas y dinámicas.
FUNCIONES Y PUNTEROS Apunte realizado por Leonel Guccione 1/7 Unidad 2: Estructuras de Datos estáticas y dinámicas. Temas: Algoritmos sobre arreglos: búsqueda del mínimo, máximo, ordenacón por selección
Tema 1. ORDENACIÓN, BÚSQUEDA E INTERCALACIÓN INTERNA (Algoritmos)
Tema 1. ORDENACIÓN, BÚSQUEDA E INTERCALACIÓN INTERNA (Algoritmos) 1. Declaraciones previas Para los algoritmos que aparecen a continuación se supone que se han realizado las siguientes declaraciones globales:
Algoritmos y Programación Clase 8
Algoritmos y Programación Ordenamiento y Búsqueda Anexo: Uso de Procedimientos Sub y Procedimientos Function 1 EXAMEN 1. Lunes 16 de abril 4 pm. 2. Tema: Lo visto hasta la clase de hoy. 2 Contenido Ordenamiento
Programación II. Mario Aldea Rivas Programación II 13/04/11 1. Mario Aldea Rivas Programación II 13/04/11 2
Programación II Bloque temático 1. Lenguajes de programación Bloque temático 2. Metodología de programación Bloque temático 3. Esquemas algorítmicos Tema 4. Introducción a los Algoritmos Tema 5. Algoritmos
Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1
Prologo Agradecimientos Nota de los autores Índice general I III V VII 1 Problemas, algoritmos y programas 1 1.1 Programas y la actividad de la programación.................... 4 1.2 Lenguajes y modelos
Fundamentos de la programación
Fundamentos de la programación 7 Grado en Ingeniería Informática Grado en Ingeniería del Software Grado en Ingeniería de Computadores Facultad de Informática Universidad Complutense Algoritmos de ordenación
23. Ordenación de vectores (tablas) Diego Gutiérrez
23. Ordenación de vectores (tablas) 1 O cómo evitar tener que buscar una aguja en un pajar Ordenación 3 Ordenación O cómo evitar tener que buscar una aguja en un pajar Cómo buscamos una palabra en un diccionario?
Análisis de algoritmos
Tema 08: Divide y vencerás (DyV) M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom 1 Contenido Introducción Divide y vencerás Observaciones
ORDENAMIENTO Y BÚSQUEDA
ORDENAMIENTO Y BÚSQUEDA Los computadores se emplean frecuentemente para almacenar y recuperar grandes volúmenes de datos. Con su velocidad y facilidad de acceso, los computadores aventajan a otros medios
3. DISEÑO DE ALGORITMOS PARALELOS Y DISTRIBUIDOS
3. DISEÑO DE ALGORITMOS PARALELOS Y DISTRIBUIDOS Uno de los ingredientes más importantes para el procesamiento paralelo son sin duda los algoritmos paralelos que tienen un considerable interés en su desarrollo.
Complejidad de algoritmos recursivos
Tema 3. Complejidad de algoritmos recursivos 1. INTRODUCCIÓN... 1 CLASIFICACIÓN DE FUNCIONES RECURSIVAS... 1 DISEÑO DE FUNCIONES RECURSIVAS... 2 2. VENTAJAS E INCONVENIENTES DE LA RECURSIVIDAD... 4 3.
Solución - práctico 10
Solución - práctico 10 Complejidad Ejercicio 1 a) Una implementación del algoritmo es la siguiente: /* Procedimiento que se encarga de realizar la unión de los dos conjuntos * ordenados der1 e izq1 son
Metodología de la Programación II. Recursividad
Metodología de la Programación II Recursividad Objetivos Entender el concepto de recursividad. Conocer los fundamentos del diseño de algoritmos recursivos. Comprender la ejecución de algoritmos recursivos.
FICHEROS Y BASES DE DATOS (E44) 3º INGENIERÍA EN INFORMÁTICA. Tema 4. Técnicas de Dispersión. Definición y Manejo.
FICHEROS Y BASES DE DATOS (E44) 3º INGENIERÍA EN INFORMÁTICA Tema 4. Técnicas de Dispersión. Definición y Manejo. 1.- Introducción. 2.- Funciones de Dispersión. 3.- Saturación Progresiva. 4.- Empaquetado