Metodologı́a y Tecnologı́a de la Programación Segundo Parcial Pregunta 1 (10 ptos) En el método de clasificación rápida (QuickSort), una técnica de partición consiste en dividir la lista en tres sublistas, las cuales contengan los elementos menores, iguales y mayores que un pivote respectivamente. Completar la clase QuickSort que implementa el método de ordenación rápida para listas pertenecientes al TDA Lista (inmutable) de acuerdo a la especificación formal y métodos en Java adjuntos. Los métodos particion, concatena y ordena deberán implementarse de forma recursiva. Se seleccionará como pivote el primer elemento de la lista. public class QuickSort { static private Lista[] particion(Lista l, Elemento pivote) { // Devuelve tres listas: // - Lista 1: Elementos de la lista l menores que pivote // - Lista 2: Elementos de la lista l iguales que pivote // - Lista 3: Elementos de la lista l mayores que pivote ... } static private Lista concatena(Lista l1, Lista l2) { // Devuelve una lista resultado de concatenar las listas l1 y l2 ... } static public Lista ordena(Lista l) { // Devuelve una lista con los elementos de la lista l ordenados crecientemente ... } } // fin class QuickSort TDA Lista: Especificación Formal Tipo Lista (Elemento) Sintaxis listavacia → Lista inserta(Lista,Elemento) → Lista vacia(Lista) → booleano cabeza(Lista) → Elemento resto(Lista) → Lista Semántica ∀ L ∈ Lista, ∀ E ∈ Elemento vacia(listavacia) ⇒ cierto vacia(inserta(L,E)) ⇒ falso cabeza(listavacia) ⇒ error cabeza(inserta(L,E)) ⇒ E resto(listavacia) ⇒ error resto(inserta(L,E)) ⇒ L Clase Lista class Lista Constructores Lista() Lista(Lista l, Elemento e) Métodos boolean vacia() Elemento cabeza() Lista resto() Clase Elemento class Elemento Constructores Elemento() Métodos int valor() Resolución Segundo Parcial Pregunta 1 (10 ptos) public class QuickSort { static private Lista[] particion(Lista l, Elemento pivote) { // Devuelve tres listas: // - Lista 1: Elementos de la lista l menores que pivote // - Lista 2: Elementos de la lista l iguales que pivote // - Lista 3: Elementos de la lista l mayores que pivote Lista[] aux; if (l.vacia()) { aux = new Lista[3]; aux[0] = new Lista(); aux[1] = new Lista(); aux[2] = new Lista(); } else { aux = particion(l.resto(),pivote); int v1 = l.cabeza().valor(); int v2 = pivote.valor(); if (v1<v2) aux[0] = new Lista(aux[0],l.cabeza()); if (v1==v2) aux[1] = new Lista(aux[1],l.cabeza()); if (v1>v2) aux[2] = new Lista(aux[2],l.cabeza()); } return aux; } static private Lista concatena(Lista l1, Lista l2) { // Devuelve una lista resultado de concatenar las listas l1 y l2 if (l1.vacia()) return l2; return new Lista(concatena(l1.resto(),l2),l1.cabeza()); } static public Lista ordena(Lista l) { // Devuelve una lista con los elementos de la lista l ordenados crecientemente if (l.vacia()) return l; Lista[] aux = particion(l,l.cabeza()); aux[0] = ordena(aux[0]); aux[2] = ordena(aux[2]); return concatena(concatena(aux[0],aux[1]),aux[2]); } } // fin class QuickSort