CC 3001 Algoritmos y Estructuras de Datos 2015/1 Tarea 2 Profesores: Nelson Baloian y Patricio Poblete Entrega: 17-4-2015 23:59 hrs. El algoritmo Mergesort ordena un arreglo de valores comparables recursivamente de la siguiente forma: public static void mergesort(Comparable[] x, int ini, int fin) { if (ini <= fin) return; int medio = ini+fin/2 mergesort (x, ini, medio); mergesort (x, medio+1, fin); merge(x, ini, medio, fin); } Merge es un método que recibe un arreglo cuyos elementos de la primera mitad (desde ini hasta medio) están ordenados por un lado y los de la segunda mitad están ordenados por otro lado y mezcla los elementos de ambas mitades para combinarlos en un solo conjunto ordenado. Este método se puede aplicar para ordenar listas enlazadas de una manera no recursiva de la siguiente manera: Al principio se considera que la lista está formada por varias sub-secuencias de elementos ordenadas llamadas runs. En cada pasada se “mezclan” dos runs ordenadas consecutivas en una sola. De este modo, después de una cierta cantidad de pasadas la lista tendrá un solo run. El principio y fin de una sub-secuencia ordenada es fácil de detectar, ya que el primer elemento está precedido por uno de mayor valor (o es el primero de la lista) y al último le sigue uno de menor valor (o es el último de la lista). En el caso extremo, un run puede estar constituido por un solo elemento. Ejemplo: sea la lista enlazada q con los elementos: q = 21 32 15 5 24 45 30 53 12 6 x y z = un run en la lista Después de la primera iteración q = 15 21 32 5 24 30 45 53 12 67 Después de la segunda iteración q = 5 15 21 24 30 32 45 53 12 67 Despues de la tercera iteración q = 5 12 15 24 30 32 45 53 67 Suponiendo que los nodos de la lista son de la siguiente clase: class Nodo { Comparable info; Nodo sig; Nodo(Comparable x, Nodo y) { info = x; sig = y; } } a) Programe el método void merge(Nodo q) que implemente el algoritmo descrito. Puede tomar decisiones de diseño con respecto a la implementación de la lista enlazada, como por ejemplo que esta tiene una cabeza de lista o inclusoagregarle doble enlace a la implementación de Nodo. Puede serle útil (pero no es necesario) programar primero el método void mergeparcial(Nodo i, Nodo j, Nodo k) que hace un merge entre dos runs que hay en la lista q. El primero parte en el nodo siguiente al nodo i (o desde el mismo nodo i si la lista es de doble enlace) y termina en nodo j (incluye a j) el segundo parte del siguiente a j y termina en el nodo k b) Experimente con el programa que desarrollo generando una serie de datos al azar y aplicándole el algoritmo. Encuentre el número de datos n1, n2, n3, n4 n5 y n6 para el cual el algoritmo se demora t1=500, t2=1000, t3=2000, t4=3000, t5=4000 y t6=5000 milisegundos respectivamente. Haga una tabla donde se grafique ti/ni2, ti/ni ti/nilog(ni) c) Escriba un informe sobre su tarea explicando cómo implemento el algoritmo, describiendo las variables principales que usa su programa y mostrando los resultados de la parte b)