Algoritmo divide y vencerás
La técnica divide y vencerás consta de los siguientes pasos:
- Dividir el problema en subproblemas menores.
- Resolver por separado cada uno de los subproblemas:
- si los subproblemas son complejos, usar la misma técnica recursivamente;
- si son simples, resolverlos directamente.
- Combinar todas las soluciones de los subproblemas en una solución simple.
Definir la función
divideVenceras :: (p -> Bool) -> (p -> s) -> (p -> [p]) -> (p -> [s] -> s) -> p -> s
tal que divideVenceras ind resuelve divide combina pbInicial resuelve el problema pbInicial mediante la técnica de divide y vencerás, donde
-
ind pbse verifica si el problemapbes indivisible -
resuelve pbes la solución del problema indivisiblepb -
divide pbes la lista de subproblemas depb -
combina pb sses la combinación de las solucionesssde los subproblemas del problemapb. -
pbIniciales el problema inicial
Usando la función DivideVenceras, definir las funciones
ordenaPorMezcla :: Ord a => [a] -> [a] ordenaRapida :: Ord a => [a] -> [a]
tales que
-
ordenaPorMezcla xses la lista obtenida ordenandoxspor el procedimiento de ordenación por mezcla. Por ejemplo,
λ> ordenaPorMezcla [3,1,4,1,5,9,2,8] [1,1,2,3,4,5,8,9]
-
ordenaRapida xses la lista obtenida ordenandoxspor el procedimiento de ordenación rápida. Por ejemplo,
λ> ordenaRapida [3,1,4,1,5,9,2,8] [1,1,2,3,4,5,8,9]