Logo Studenta

Sesión 09_Mg Orleans Gálvez Tapia

¡Este material tiene más páginas!

Vista previa del material en texto

ANÁLISIS DE ALGORITMOS Y 
ESTRATEGIAS DE PROGRAMACIÓN
Docente: 
Mg. Gálvez Tapia Orleans Moisés
CIP. 171497
UNIDAD 1:
LA COMPLEJIDAD ALGORÍTMICA Y 
PRINCIPALES ESTRATEGIAS DE 
PROGRAMACIÓN
SEMANA 09: Divide y vencerás
¿Qué algoritmos de 
ordenamiento 
conoce?
SABERES PREVIOS
AGENDA:
1. Características de los algoritmos Divide y Vencerás (Divide y Conquista)
2. Algoritmo de ordenamiento por Selección en Python y Java
3. Algoritmo de ordenamiento Quicksort en Python y Java
4. Algoritmo de ordenamiento Shell en Python y Java
5. Algoritmo de Búsqueda Binaria en Python y Java
6. Conclusiones
7. Referencias Bibliográficas
LOGRO DE LA SESIÓN
Al término de la clase, el estudiante implementa algoritmos 
de ordenamiento y búsqueda en Python mostrando dominio 
técnico del lenguaje y una lógica coherente.
ALGORITMOS DIVIDE Y VENCERÁS
Un algoritmo Divide y Vencerás resuelve un problema en 3 pasos:
1. Divide el problema en un número de subproblemas que son
instancias más pequeñas del mismo problema.
2. Vence los subproblemas al resolverlos de manera recursiva. Si
son los suficientemente pequeños, resuelve los subproblemas como
casos base.
3. Combina las soluciones de los subproblemas en la solución para el
problema original.
ALGORITMOS DIVIDE Y VENCERÁS
Si expandimos la cantidad de pasos recursivos, se ve así:
APLICACIÓN DEL PARADIGMA DIVIDE Y VENCERÁS
ORDENAMIENTO QUICKSORT
QuickSort ordena recursivamente un arreglo dividiéndolo en dos
subarreglos.
o Si el subarreglo tiene tamaño 0 o 1, entonces ya está
ordenado, y no tiene que hacerse nada.
o De lo contrario, QuickSort utiliza divide y vencerás para
ordenar al subarreglo.
El paso de dividir debe hacer una partición del arreglo (pivote), el
paso de vencer debe hacer ordenamiento rápido recursivamente
en los subarreglos divididos y el paso de combinar no debe hacer
nada.
El método de ordenación por selección consiste en repetir los siguientes pasos:
1. Se busca el elemento más pequeño del array y se coloca en la primera posición.
2. Entre los restantes, se busca el elemento más pequeño y se coloca en la segunda posición.
3. Entre los restantes se busca el elemento más pequeño y se coloca en la tercera posición.
Este proceso se repite hasta colocar el último elemento.
50 26 7 9 15 27
7
De forma gráfica el proceso sería el siguiente:
5026 9 15 27
9 2650 15 27
5015 26 27
27 50
5026 27
Array original
Se coloca el 7 en la primera posición. Se intercambian 7 y 50.
Se coloca el 9 en la segunda posición. Se intercambian 9 y 26.
Se coloca el 15 en la tercera posición. Se intercambian 15 y 50.
El menor de los que queda es 26. Se deja en su posición.
Se coloca el 27 en la quinta posición. Se intercambian 27 y 50.
ALGORITMO DE ORDENAMIENTO POR SELECCIÓN
//método java de ordenación por selección
public static void seleccion(int A[]) {
int i, j, menor, pos, tmp;
for (i = 0; i < A.length - 1; i++) {
menor = A[i];
pos = i;
for (j = i + 1; j < A.length; j++){
if (A[j] < menor) {
menor = A[j];
pos = j;
}
}
if (pos != i){
tmp = A[i];
A[i] = A[pos];
A[pos] = tmp;
}
}
}
50 26 7 9 15 27
26 9 15 27
26
5015 26 27
27 26
7 50
i = 0; i < A.length - 1; i++
j = i + 1; j < A.length; j++
5026 27
50 15 279
Tomamos como menor el primero de los elementos 
que quedan por ordenar y guardamos su posición
Buscamos en el resto del array algún
elemento menor que el actual
Si hay alguno menor se intercambia
ALGORITMO DE ORDENAMIENTO POR SELECCIÓN
ALGORITMO DE ORDENAMIENTO POR SELECCIÓN EN PYTHON
[0] [1] [2] [3] [4] [5]
10 40 7 9 15 27
10 40 7 9 15 27
10 40 7 9 15 27
i j
10 9 7 40 15 27
10 9 7 40 15 27
j i
7 9 10 40 15 27
Subarray 1 Subarray 2
Array original a ordenar
Se toma como pivote el primer elemento
Se intercambian
La búsqueda de izquierda a derecha encuentra el 40,
mayor que el pivote y la búsqueda de derecha a
izquierda encuentra el 9, menor que el pivote
Continua la búsqueda, se encuentra el valor 40
mayor que el pivote y el valor 7 menor que el pivote,
pero ya se han cruzado. PARAMOS
Finalmente colocamos el pivote en su lugar (posición
j). Quedando el array dividido en dos subarrays a los
que se aplicará el mismo proceso.
ALGORITMO DE ORDENAMIENTO QUICKSORT
[0] [1] [2] [3] [4] [5]
7 9 10 40 15 27
[ izq] [ j -1] [ j ] [ j+1 ] [ der]
Subarray 1 Subarray 2
ALGORITMO DE ORDENAMIENTO QUICKSORT
ALGORITMO DE ORDENAMIENTO QUICKSORT EN PYTHON
public void quicksort(int izq, int der) { 
int pivote=vector[izq], i=izq, j=der, aux; 
while(i<j){ 
while(vector[i]<=pivote && i<j) i++; 
while(vector[j]>pivote) j--; 
if (i<j) { 
aux= vector[i]; 
vector[i]=vector[j]; 
vector[j]=aux; 
} 
} 
vector[izq]=vector[j]; 
vector[j]=pivote; 
if(izq<j-1)
quicksort(izq,j-1); 
if(j+1 <der)
quicksort(j+1,der); 
}
// Mientras no se crucen los índices
// Busca elemento mayor que pivote
// Busca elemento menor que pivote
// Si no se han cruzado i y j
/* Intercambio los elementos de las
posiciones i y j */
// Colocamos al pivote a su lugar [j]
/* Si el sub vector izquierdo tiene por lo
menos dos elementos */
/* Si el sub vector derecho tiene por lo
menos dos elementos*/
ALGORITMO DE ORDENAMIENTO QUICKSORT EN JAVA
[0] [1] [2] [3] [4] [5]
50 26 7 9 15 27
26
269 15 277 50
i = salto; i < v.length; i++
salto = t/2; salto !=0; salto/2
5015 279
t = tamaño() = 6
Intercambio = F
Intercambio = V
7
Intercambio = V
Intercambio = F
Intercambio = V
salto = t/2 = 3
Mientras (Intercambio = V)
ALGORITMO DE ORDENAMIENTO SHELL
9 26 277 5015
[0] [1] [2] [3] [4] [5]
26
9 26 277 50
507 279
Intercambio = F
… Continuo otra iteración con el mismo valor del salto (salto = 1)
15
Intercambio = V
Intercambio = F
i = salto; i < v.length; i++
15
26507 279 15
50267 279 15
Intercambio = F
Intercambio = V
27267 509 15
Intercambio = V
Mientras (Intercambio = V)
salto = 3/2 = 1
ALGORITMO DE ORDENAMIENTO SHELL
[0] [1] [2] [3] [4] [5]
9 7 15 26 27 50
27
7 27 5015 26
269 507
Intercambio = F
salto = 1/2; salto =0; salto/2
Como el salto ya es igual a CERO el algoritmo termina
15
Intercambio = V
Intercambio = F
i = salto; i < v.length; i++
9
27269 507 15
27269 507 15
Intercambio = F
Mientras (Intercambio = V)
Intercambio = F
Intercambio = F
salto = 1
ALGORITMO DE ORDENAMIENTO SHELL
ALGORITMO DE ORDENAMIENTO SHELL EN PYTHON
public void shell(){
int salto,aux; 
int t=tamaño(); 
boolean intercambio;
for(salto=t/2; salto!=0; salto=salto/2){
intercambio=true;
while(intercambio){ 
intercambio=false;
for(int i=salto; i<vector.length;i++){ 
if(vector[i-salto]>vector[i]){ 
aux=vector[i]; 
vector[i]=vector[i-salto];
vector[i-salto]=aux;
intercambio=true; 
}
} 
}
}
}
// Se da una pasada con el mismo SALTO
// y si están desordenados
// se intercambian
// y se marca como cambio.
// Mientras se intercambie algún elemento
ALGORITMO DE ORDENAMIENTO SHELL EN JAVA
BÚSQUEDA BINARIA
BÚSQUEDA BINARIA
Elemento buscado: 23
Retornar [5]
BÚSQUEDA BINARIA EN PYTHON
BÚSQUEDA BINARIA
public int busquedaBinaria(){ 
int n=tamaño(), 
int inferior = 0, superior = n-1;
while(inferior <= superior){ 
int centro = (superior + inferior) / 2; 
if (elemento == vector[centro]){
return centro;
} 
else { 
if (elemento < vector[centro]){
superior = centro - 1;
} 
else {
inferior = centro + 1;
} 
} 
} 
return -1; 
}
// mientras exista 
por lo menos un 
elemento en el 
arreglo
CONCLUSIONES
1. Un algoritmo Divide y Vencerás resuelve un problema siguiendo estos 3 pasos.
o Dividir: Descomponer el problema en sub-problemas.
o Vencer: Resolver los sub-problemas recursivamente.
o Combinar las soluciones de los subproblemas en la solución para el problema original.
2. Este enfoque algorítmico trabaja recursivamente y los pasos de Vencer y Combinar trabajan tan a la
par que parece un sólo paso.
REFERENCIAS BIBLIOGRÁFICAS
REFERENCIA ENLACEUna introducción a las matemáticas para el 
análisis y diseño de algoritmos 
https://elibro.bibliotecaupn.elogim.com/es/lc/upnort
e/titulos/35059
Manual de algorítmica: recursividad, complejidad y 
diseño de algoritmos 
https://elibro.bibliotecaupn.elogim.com/es/lc/upnort
e/titulos/56561
Introducción práctica a la programación con 
Python 
https://elibro.bibliotecaupn.elogim.com/es/lc/upnort
e/titulos/124259
Criptografía sin secretos con Python https://elibro.bibliotecaupn.elogim.com/es/lc/upnort
e/titulos/106497
ACM UVA Online http://uva.onlinejudge.org/
ACM ICPC Competition https://icpc.global/compete/preparation
https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/35059
https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/35059
https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/56561
https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/56561
https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/124259
https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/124259
https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/106497
https://elibro.bibliotecaupn.elogim.com/es/lc/upnorte/titulos/106497
http://uva.onlinejudge.org/
https://icpc.global/compete/preparation
	Diapositiva 1
	Diapositiva 2
	Diapositiva 3: UNIDAD 1: LA COMPLEJIDAD ALGORÍTMICA Y PRINCIPALES ESTRATEGIAS DE PROGRAMACIÓN
	Diapositiva 4
	Diapositiva 5
	Diapositiva 6
	Diapositiva 7
	Diapositiva 8
	Diapositiva 9
	Diapositiva 10
	Diapositiva 11
	Diapositiva 12
	Diapositiva 13
	Diapositiva 14
	Diapositiva 15
	Diapositiva 16
	Diapositiva 17
	Diapositiva 18
	Diapositiva 19
	Diapositiva 20
	Diapositiva 21
	Diapositiva 22
	Diapositiva 23
	Diapositiva 24
	Diapositiva 25
	Diapositiva 26
	Diapositiva 27
	Diapositiva 28

Más contenidos de este tema