1.- El siguiente ordenamiento contiene errores, localícelos y proponga una solución. bandera = 0; do{ for(i = 0; i < N-1; i++,N--) if(a[i]>a[i+1]) intercambia(a, i, i+1); }while (bandera == 1); Solución: Solo hace una pasada debido a que el valor de la bandera nunca cambia. La bandera debe cambiar cuando se hacen intercambios y debe permanecer en cero cuando no hay intercambios (el arreglo ya esta ordenado) de lo contrario entraría en un ciclo infinito. do{ bandera = 0; for (i = 0; i < N-1; i++) if(a[i] > a[i+1]){ intercambia (a, i, i+1); bandera = 1; }N--; }while (bandera ==1); 2.- Realice modificaciones al siguiente algoritmo para que realice un solo intercambio al final del ciclo interno. for (i = 0; i < N-1; i++) for (j = i +1; j < N; j++ ) if (a[i] > a[j]) intercambia (a, i, j); Solución: for (i = 0; i < N-1; i++){ men = i; for (j = i+1; i < N; i++) if (a[men] > a[j]) men = j; intercanbia (a, I, men); } 3.- Realice el recorrido por anchura del grafo de la siguiente figura, comenzando por el nodo 1. 9 4 2 5 28 10 8 7 8 8 1 1 1 5 7 7 6 8 26 2 27 3 Solución: {1} (1,2)(1,3)(1,5) {1,2} (1,3)(1,5)(2,1)(2,4)(2,5)(2,6) {1,2,3} (1,5)(2,1)(2,4)(2,5)(2,6)(3,1)(3,6)(3,8) {1,2,3,5} (2,1)(2,4)(2,5)(2,6)(3,1)(3,6)(3,8)(5,1)(5,2)(5,4)(5,6) {1,2,3,5,4} (2,5)(2,6)(3,1)(3,6)(3,8)(5,1)(5,2)(5,4)(5,6)(4,2)(4,5)(4,7)(4,8) {1,2,3,5,4,6} (3,1)(3,6)(3,8)(5,1)(5,2)(5,4)(5,6)(4,2)(4,5)(4,7)(4,8)(6,2)(6,3)(6,5)(6,7)(6,8) {1,2,3,5,4,6,8} (5,1)(5,2)(5,4)(5,6)(4,2)(4,5)(4,7)(4,8)(6,2)(6,3)(6,5)(6,7)(6,8)(8,3)(8,4)(8,6)(8,7) {1,2,3,5,4,6,8,7} (4,8)(6,2)(6,3)(6,5)(6,7)(6,8)(8,3)(8,4)(8,6)(8,7)(7,4)(7,6)(7,8) 2 4 7 1 5 3 6 8 4.- Aplique el algoritmo de Kruskal al grafo de la siguiente figura. 9 4 2 5 28 10 8 7 8 8 1 1 1 5 6 7 7 8 26 2 27 3 Solución: Primero colocamos todos los arcos en una cola de prioridad. 1,5, 1 6,8, 1 1,3, 2 4,5, 5 4,8, 7 7,8, 7 2,5, 8 4,7, 8 5,7, 8 2,4, 9 2,6, 10 3,6, 24 5,6, 26 3,8, 27 1,2, 28 Después vamos sacando los arcos de la cola, si el arco crea un ciclo lo desechamos y tomamos otro, así hasta que la cola este vacia. Desechados 4 2 7 5 8 7 1 7 1 5 6 8 1 2 3 5.- Demuestre que el grafo de la siguiente figura es planar dibujándolo. 1 2 3 4 5 Solución: 1 5 4 6. El siguiente método de ordenamiento tiene fallas, localícelas y proponga una solución. 2 3 template <class T> void Heapsort(T *a, int tam){ int i; for(I = (tam-1) / 2; I >= 0; i --) bajarmonticulo(a, tam, i); while(tam>0){ intercambia(a, tam - 1); bajarmonticulo(a, --tam, 0); } } template <class T> void bajarmonticulo(T *a, int ult, int k){ T v = a [k]; While(k <= (ult-1) / 2){ j = k*2 + 1; if(j < (ult - 1)) if(a [j] < a [j+1] ) j++; if(v >= a [j] ) break; a [k] = a [j]; k = j; } a [k] = v; } Solución: La función de bajar monticulo no considera llegar a una hoja y en ese caso j > ult-1. Para corregirlo debe salirse del ciclo si detecta esta condición. template <class T> void bajarmonticulo(T *a, int ult, int k){ T v = a [k]; While(k <= (ult-1) / 2){ j = 2 * k + 1; if(j > (ult - 1)) break; if(j < (ult-1)) if(a [j] < a [j+1] ) j++; if(v >= a [j] ) break; a [k] = a [j]; k = j; } a [k] = v; } 7. Escriba el seudo código de la búsqueda por profundidad Tomar el nodo inicial como nodo actual. Hacer Si nodo actual no esta visitado Meter nodo actual a visitados y meter adyacentes del nodo actual a una pila Sacar elemento de la pila y hacerlo el nodo actual Mientras la pila no este vacía repetir ciclo. 8. Realice una prueba de escritorio para el siguiente fragmento de código en C. template <class T> void Mergesort(T *a, int N, int izq, int der){ int i, j, k, m ; T *b ; if(der > izq){ m = (izq + der) / 2 ; Mergesort(a, N, izq, m) ; Mergesort(a, N, m+1, der) ; b = new T[N] ; for(i = izq ; i <= der ; i++) b[i]= a[i]; for(i = izq , j = izq , k = m+1; i <= der ; i++) if(j <= m && k <= der) a[i] = (b[j] < b[k]) ? b [j++] : b[k++]; else a[i] = (k > der) ? b [j++] : b[k++]; delete [] b; } } int datos [10]= {8, 9, 5, 3, 1, 2, 4, 6, 0, 7}; Mergesort(datos, 10, 0 , 9); Solución Merge(0,9) m = 4 “llamadas” m=4 Merge (0,4) termina al mezclar 0 a 2 con 3 a 4 Merge (5,9) termina al mezclar 5 a7 con 8 a 9 mezclar 0 a 4 con 5 a 9 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} Merge (0,4) m = 2 Merge(0,2) termina al mezclar 0 a 1 con 2 a 2 Merge(3,4) termina al mezclar 3 a 3 con 4 a 4 mezclar 0 a 2 con 3 a 4 {1, 3, 5, 8, 9, 2, 4, 6 , 0, 7} Merge (0,2) m = 1 Merge (0,1) termina al mezclar 0 a 0 con 1 a 1 Merge (2,2) 2 > 2 mezclar 0 a 1 con 1 a 1 {5, 8, 9, 3, 1, 2, 4, 6, 0, 7} Merge (0,1) m = 0 Merge (0,0) 0 > 0 Merge (1,1) 1 > 1 mezclar 0 a 0 con 1 a 1 {8, 9, 5, 3, 1, 2, 4, 6, 0, 7} Merge (3,4) m = 3 Merge (3,3) 3 > 3 Merge (4,4) 4 > 4 mezclar 3 a 3 con 4 a 4 {5, 8, 9, 1, 3, 2, 4, 6, 0, 7} Merge (5,9) m = 7 Merge (5,7) termina al mezclar 5 a 6 con 7 a 7 Merge (8,9) termina al mezclar 8 a 8 con 9 a 9 mezclar 5 a 7 con 8 a 9 {1, 3, 5, 8, 9, 0, 2, 4, 6, 7} Merge (5,7) m = 6 Merge (5,6) termina al mezclar 5 a 5 con 6 a 6 Merge (7,7) 7 > 7 mezclar 5 a 6 con 7 a 7 {1, 3, 5, 8, 9, 2, 4, 6, 0, 7} Merge (5,6) m = 5 Merge (5,5) 5 > 5 Merge (6,6) 6 > 6 mezclar 5 a 5 con 6 a 6 {1, 3, 5, 8, 9, 2, 4, 6, 0, 7} Merge (8,9) m = 8 Merge (8,8) 8 > 8 Merge (9,9) 9 > 9 mezclar 8 a 8 con 9 a 9 {1, 3, 5, 8, 9, 2, 4, 6, 0 ,7} 9. Realice una prueba de escritorio para el siguiente fragmento de código en C. template <class T> void Quicksort(T *a, int izq, int der){ int i, j ; T v, t ; if( der > izq){ v = a [der] ; for(i = izq -1, j = der ; ;){ while(a [++i] < v); while(a [--j] > v && j > 0); if(j <= i) break; t = a [i]; a [i] = a [j]; a [j] = t; } t = a [i]; a [i] = a [der]; a [der] = t; Quicksort (a, izq, i-1); Quicksort (a, i+1, der); } } int datos [10] = {8, 9, 5, 3, 1, 2, 4, 6, 0, 7}; Quicksort(datos, 10, 0, 9); Solución {8, 9, 5, 3, 1, 2, 4, 6, 0, 7} v = 7 Quick (0,9) Intercambia (a, 0, 8) {0, 9, 5, 3, 1, 2, 4, 6, 8, 7} j i Intercambia(a, 1, 7) {0, 6, 5, 3, 1, 2, 4, 9, 8, 7} j <= i Intercambia(a, 7, 9) Quick (0,6) Quick (8,9) {0, 6, 5, 3, 1, 2, 4, 7, 8, 9} v = 4 Quick(0,6) Intercambia (a, 1, 5) {0, 2, 5, 3, 1, 6, 4, 7, 8, 9} Intercambia(a, 2, 4) {0, 2, 1, 3, 5, 6, 4, 7, 8, 9} j <= i Intercambia(a, 4, 6) Quick (0,3) Quick (5,6) {0, 2, 1, 3, 4, 6, 5, 7, 8, 9} v = 3 Quick(0,3) j <= i Intercambia (a, 3, 3) Quick (0,2) Quick (4,3) 4<3 {0, 2, 1, 3, 4, 6, 5, 7, 8, 9} v = 1 Quick (0, 2) j <= i Intercambia(a, 1, 2) Quick (0,0) Quick (2,2) i j 0<0 2<2 {0, 1, 2, 3, 4, 6, 5, 7, 8, 9} v = 5 Quick (5,6) j <= i Intercambia (a, 5, 6) Quick (5,4) Quick (6,6) 5<4 6<6 j i {0, 1, 2, 3, 4, 5, 6, 7, , 8, 9} v = 9 Quick (8,9) j <= i Intercambia (a, 9, 9) Quick (8,8) Quick (10,9) 8<8 10<9 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 10. Aplique el algoritmo de Dijkstra al grafo de la figura 3 iniciando en el nodo 1. 9 4 2 10 5 8 28 7 8 8 7 1 7 26 1 5 1 6 8 2 27 24 3 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 0 28 2 & 1 & & & & 0 & 9 & 10 & & & & 0 & & 24 & 27 & & & 0 5 & 8 9 & & & & 0 26 & & & & & & & 0 8 1 & & & & & & 0 7 & & & & & & & 0 (1,2) (1,3) (1,5) (2,4) (2,6) (3,6) (3,8) (5,2) (5,6) (4,5) (4,7) (4,8) (6,7) (6,8) 28 2 1 9 18 19 20 26 1 0 0 0 0 0 0 0 0 0 2 28 28 28 9 9 9 9 9 9 3 2 2 2 2 2 2 2 2 2 4 & 37 37 37 18 18 18 18 18 5 1 1 1 1 1 1 1 1 1 6 & 38 26 26 19 19 19 19 19 7 & & & & & 26 26 26 26 8 & & 29 29 29 25 20 20 20 {1} {1,2} {1,2,3} {1,2,3,5} regresar al 2, 4 y 6 no se han visitado {1,2, 3, 5, 4} {1,2, 3, 5, 4, 6} {1, 2, 3, 5, 4, 6,8} {1, 2, 3, 5, 4, 6, 8,7} 9 4 2 10 28 8 8 7 1 5 6 1