A continuación se encuentra la representación gráfica de un nodo

Anuncio
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)
Documentos relacionados
Descargar