Mergesort como ejemplo de Divide y Vencerás

Slides:



Advertisements
Presentaciones similares
Ejercicio: 1.- Dado el siguiente esquema: Art1 Art2 Art3
Advertisements

Estructuras de control Secuenciales y selectivas
Octavio Alberto Alvarez Giner Agustín Iván Mota González.
Estructuras de decisión en C
Profesora: Nelwi Báez P
Ejemplo de Programa C++
Funciones y recursividad
MANUAL EXPRESS DE C J.M.sevilla.
Unidad 5 Listas Enlazadas Bibliografía: Algoritmos y Estructuras de datos de Aguilar y Martinez. Unidad 9 Autor: Ing Rolando Simon Titiosky.
ALGORITMOS DE ORDENAMIENTO
CAPITULO I. ARREGLOS Un arreglo es un grupo de posiciones en memoria relacionados entre si, por el hecho de que todas tienen el mismo nombre y son del.
Paricial IV Ing. Esmeralda Elizabeth Rodríguez Rodríguez
LOGROS DEL PERÍODO Utiliza de forma correcta las funciones para entrada y salida de datos en c++. Utiliza los elementos básicos de un programa en c++.
Estructuras de control
Fundamentos de la Programación Estructurada
Informática I Código Semestre Para Ingeniería Electrónica e Ingeniería de Telecomunicaciones Profesor: Sebastián Isaza.
Programación, Algoritmos y Estructuras de Datos
Primer Programa en C.
EJERCICIOS DE PROGRAMACION
Comparador de iluminación Sensor de puerta Potencia Iluminación Generador Alarma.
INFORMATICA I Arreglos 1 CLASE 17.
INFORMATICA I Arreglos 2 CLASE 18.
INFORMATICA I Funciones CLASE 13.
ESTRUCTURA DEL LENGUAJE C
Principios y Herramientas de Programación
Aplicaciones Multihilo
Aprende C en una lluviosa tarde de domingo (en algo más de un par de horas) Sintaxis del lenguaje C para implementar un programa imperativo.
Ocurre con frecuencia, tanto en programación como en la vida real, que las decisiones que se nos pide tomar son más complicadas que una simple selección.
SOBRECARGA DE FUNCIONES
Unidad 3 Punteros.
Ejemplos en C /* Ejemplos L/E en C con printf y scanf */ #include #include main(){ int i; int i; char nombre[30]; char nombre[30]; printf ("\nIntroduce.
Curso Práctica 3 1 Funciones CONTENIDO Consideraciones sobre funciones Estructura de un programa en C Uso de funciones Paso de parámetros Punteros.
String o Cadenas Prof. Gonzalo Pastor. Cadenas o String ► En C, una cadena o texto se define como un vector de caracteres de longitud determinada que.
Arreglos: Vectores en JAVA
Funciones “En C” Semestre de Otoño 2006 Claudio Gutiérrez-Soto.
Funciones y procedimientos
FUNCIONES EN C.
Programación I Teoría II
El lenguaje de programación C - Funciones -
Programa “Coordenadas” Ing. Arturo Díaz Vargas Departamento de Sistemas División de Ciencias Básicas e Ingeniería UNIVERSIDAD AUTONOMA METROPOLITANA.
LENGUAJE “C” Programación.
Asignatura: Lenguaje de Programación de Sistemas PPT No.05 Programa vespertino de Ingeniería (E) en Sistemas Computacionales Profesor: José Estay Araya.
Introducción a la Computación
Semana 5 Subprogramas..
Tema 7c Entrada y salida de funciones. Funciones Funcion Entradas SalidasTareas.
Características de “C” Y Esta conformado por un Ambiente Integrado. Y Es un Lenguaje de Nivel medio. Y Es un compilador. YContiene un conjunto de palabras.
FUNCIONES EN C.
Estructuras de Iteracion (Repetitivas ) while , for,, do-while
M.C. Yalu Galicia Hdez. (FCC/BUAP)
CI TEORIA semana 4 Estructura Algorítmica: SELECCIÓN
Lenguaje C Ing. Sonia Alexandra Pinzón Nuñez
Elaborado por Fernando Torre - Universidad Simón Bolívar ARREGLOS CI Computación I Universidad Simón Bolívar Dpto. de Computación y Tecnología de.
Algoritmos para Ordenar datos
Ejemplos openMP.
Búsqueda. Búsqueda Secuencial Es el método de búsqueda más sencillo En un arreglo o lista ligada consiste en ir visitando cada uno de sus elementos y.
INSTITUTO TECNOLOGICO DE APIZACO
Introducción a la Programación “El lenguaje C” Manuel Crisosto M., Claudio Gutiérrez S., Christian Vidal C.
Laboratorio Análisis y Diseño de Algoritmos 2 Biblioteca estándar de templates de C++ Standard Template Library (STL)‏ Motivación Ejemplo: Lista + Iterador.
Tipo de dato Arreglo en C Uso del for con arreglos
Trazado. 1 Intercambio sin error #include void intercambio(int *, int *); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(&a,&b);
Definición de subprogramas en C
Capitulo 4 Arreglos o Arrays Unidimensionales Bidimensionales Strings
LENGUAJE “C” Programación.
LENGUAJE “C” Programación.
TIPOS DE DATOS Estructuras de control y repetición PARCIAL III.
Funciones y paso de parámetros Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Unidad Didáctica 24.
Introduction a la Programacion
FUNCIONES Y PROCEDIMIENTOS
Escribe el nombre a los números 1 _______________________ 2 _______________________ 3_______________________ 4_______________________ 5 _______________________.
Fundamentos de Informática Especialidad de Electrónica –
Transcripción de la presentación:

Mergesort como ejemplo de Divide y Vencerás Ampliación de Informática Abril, 2002

Práctica 5. Mergesort como ejemplo de Divide y Vencerás /* PRACTICA 5. 18 DE ABRIL DE 2002. ALGORITMO MERGESORT COMO EJEMPLO DIVIDE Y VENCERAS SE USA FUNCION rand PARA GENERAR NUMEROS ALEATORIOS MERGESORT REALIZA LLAMADAS RECURSIVAS A SI MISMA PARA DIVIDIR EL VECTOR EN SUBVECTORES Y ORDENARLOS. DESPUES UTILIZA EL ALGORITMO FUSIONAR PARA MEZCLAR LAS DOS SUBMITADES ORDENADAS. EL ALGORITMO ESCRIBE_VECTOR MUESTRA EL CONTENIDO DE UN TROZO DE VECTOR, ENTRE LAS POSICIONES [izda..dcha] */ Práctica 5. Mergesort como ejemplo de Divide y Vencerás

Práctica 5. Mergesort como ejemplo de Divide y Vencerás #include<stdio.h> #include<stdlib.h> main(){ int i, n, v[11]; void mergesort(); void escribir_vector(); printf ("\nRealizo ordenacion por fusion"); printf ("\nTamaño del vector (máx. 11): "); scanf ("%d", &n); while (n > 0 && n <= 11) { for (i=0; i < n; i++) v[i] = (1.0 * rand())/(RAND_MAX * 0.1); printf ("\nAntes: "); escribir_vector(v, 0, n-1); mergesort (v, 0, n-1); printf ("\nDespués: "); escribir_vector(v, 0, n-1); printf ("\nNumero de elementos (<=11): "); scanf ("%d", &n); } Práctica 5. Mergesort como ejemplo de Divide y Vencerás

Práctica 5. Mergesort como ejemplo de Divide y Vencerás void mergesort (int *v, int izda, int dcha) { int i, j, k, tmp, *u, *w; void fusionar(); void escribir_vector(); /* Si la porcion del vector tiene tamaño 1, ha terminado */ switch (dcha - izda + 1) { case 1: printf ("\n Tamaño 1: %d", v[izda]); break; case 2: if (v[izda] > v[dcha] ) { tmp = v[izda]; v[izda]= v[dcha]; v[dcha] = tmp; }; printf ("\nTamaño 2: %d <= %d", v[izda], v[dcha]); Práctica 5. Mergesort como ejemplo de Divide y Vencerás

Práctica 5. Mergesort como ejemplo de Divide y Vencerás default: /* Hay más de dos elementos, se crean dos mitades */ /* Reservamos sitio para las dos mitades */ u = (int *) calloc ((dcha - izda + 1)/2, sizeof(int)); w = (int *) calloc ((dcha - izda + 1)/2 + 1, sizeof(int)); if (u == NULL || w ==NULL) exit(-1); printf ("\nSubmitad izquierda [%d,%d]=", izda, (dcha+izda)/2); escribir_vector (v, izda, (izda+dcha)/2); for (i=izda, j=0; i<=(izda+dcha)/2;i++, j++) u[j] = v[i]; printf ("\nSubmitad derecha [%d,%d]=", (dcha+izda)/2 + 1, dcha); escribir_vector (v, (dcha+izda)/2+1, dcha); for (k=0, i=(dcha+izda)/2+1; i <= dcha; i++) w[k++] = v[i]; Práctica 5. Mergesort como ejemplo de Divide y Vencerás

Práctica 5. Mergesort como ejemplo de Divide y Vencerás mergesort (u, 0, j-1) ; /* Ordeno por fusión parte izda.*/ mergesort (w, 0, k-1); /* Ordeno por fusión parte dcha.*/ printf ("\nIntenta fusionar: \n"); escribir_vector (u, 0, j-1); escribir_vector (w, 0, k-1); fusionar (u, w, v, izda, dcha, j-1, k-1); /* Todas las mitades serán contiguas*/ printf ("\nTras fusionar\n"); escribir_vector (v, izda, dcha); /* Cuando ya están fusionados en v, DEBO liberar las dos mitades creadas */ free( (void *) u); free ((void *) w); } /* switch*/ return; } /* mergesort */ Práctica 5. Mergesort como ejemplo de Divide y Vencerás

Práctica 5. Mergesort como ejemplo de Divide y Vencerás mergesort (u, 0, j-1) ; /* Ordeno por fusión parte izda.*/ mergesort (w, 0, k-1); /* Ordeno por fusión parte dcha.*/ printf ("\nIntenta fusionar: \n"); escribir_vector (u, 0, j-1); escribir_vector (w, 0, k-1); fusionar (u, w, v, izda, dcha, j-1, k-1); /* Todas las mitades serán contiguas*/ printf ("\nTras fusionar\n"); escribir_vector (v, izda, dcha); /* Cuando ya están fusionados en v, DEBO liberar las dos mitades creadas */ free( (void *) u); free ((void *) w); } /* switch*/ return; } /* mergesort */ Práctica 5. Mergesort como ejemplo de Divide y Vencerás

Práctica 5. Mergesort como ejemplo de Divide y Vencerás void fusionar (int *izdo, int *dcho, int *final, int izda, int dcha, int M, int N) { int i, j, k; /* para recorrer las dos mitades */ k = izda; i = 0; j = 0; /* Mientras haya elementos en los dos, tomo el menor o dos si son iguales; ambas mitades ya están ordenadas */ while ((i <= M) && (j <= N)) { if (izdo[i] < dcho[j]) final[k++] = izdo[i++]; else{ if (izdo[i] > dcho[j]) final[k++] = dcho[j++]; else { final[k++] = izdo[i++]; final[k++] = dcho[j++]; } } } /* while */ /* Cuando sólo queden elementos en uno, me quedo con todos los que falten, porque ya estarán ordenados */ while (i <= M) final[k++] = izdo[i++]; /*sólo queda mitad izda.*/ while (j <= N) final[k++] = dcho[j++]; /* sólo queda mitad dcha.*/ } /* fusionar()*/ Práctica 5. Mergesort como ejemplo de Divide y Vencerás

Práctica 5. Mergesort como ejemplo de Divide y Vencerás void escribir_vector (int *v, int izda, int dcha){ int k; printf("\n"); for (k=izda; k <= dcha; k++) printf("%d\t", v[k]); printf("\nENTER para continuar\n"); getchar(); } Práctica 5. Mergesort como ejemplo de Divide y Vencerás