Vous êtes sur la page 1sur 9

HERRERA MAYA LUIS AL11505750

Instrucciones: Resuelve los siguientes ejercicios que se presentan a continuation


a. Calcula los tiempos de ejecucion en el mejor, peor, y caso promedio del
programa siguiente:
Constante n = un numero entero (int)
Type vector = Array [1..n] de int
Programa Algoritmo1(VAR a:vector)
int i,j
int temp

BEGIN
For i=1 to n-1 do
For j=n to i+1 by -1 do
If a[j-1]>a[j] then
temp=a[j-1]
a[j-1]=a[j]
a[j]=temp
END IF
END FOR
END FOR
END Algoritmol;

Como primer paso estableceremos el numero de operaciones elementales (OPEL) que se
ejecutan en el algoritmo:

La cantidad de operaciones por cada iteration interior, en caso de que a[j-1] > a[j] esta
dada por:
T(n) = 3 + 2 + 2 + 1 + 2 = 10
Para el caso de que no se cumpla la condition a[j-1 ] > a[j]
Instruction OPEL
For i=1 to n-1 do

For j=n to i+1 by -1 do

If a[j-1]>a[j] then 3
temp=a[j-1] 2
a[j-1]=a[j] 2
a[j]=temp 1
END IF

END FOR 2
END FOR 2
1
2
8
9
T(n) = 3 + 2 = 5
Cabe hacer mencion que en todos los casos las veces que se ejecutan ambas iteraciones
es igual, lo unico que difiere es la cantidad que se ejecutan las asignaciones dentro del
bucle if, lo que hace que se ejecuten n-1 veces el ciclo interior, y n-1 veces el ciclo interior,
o un total de n
2
-2n+1 veces ambos ciclos.
En cuanto al tiempo de ejecucion se tiene que se ejecutan dos OPEL en el ciclo exterior,
lo que hace para el mejor de los casos
T(n) = 2 (n-1) * 5 (n-1) = 10n2-20n+10
Y para el peor de los casos en que se ejecutarian los ciclos if para todos los casos:
T(n) = 2 (n-1) * 10 (n-1) = 20n2-40n+20
El cual toma el doble de tiempo que del mejor de los casos, lo cual podemos deducir que
para el caso promedio tendriamos
T(n) = 15n2-15n+15
Dependiendo de la cantidad de elementos del arreglo (n)
b. Investiga acerca del algoritmo de Ordenamiento por Insercion (Insertion
Sort).
i. Escribe el procedimiento para que ordene de forma creciente.
ii. Construye su representation en pseudocodigo
iii. Construye su representacion en diagrama de flujo
iv. Programa el codigo en lenguaje C o Java, y reporta los resultados
Este metodo de ordenacion itera un elemento por cada repetition moviendolo a una
position ordenada en una lista creciente. Por cada iteration, el algoritmo remueve un
elemento de los datos de entrada, encuentra la localidad que le pertenece dentro de una
lista ordenada de elementos previamente iterados y lo inserta ahi. Se repite hasta que no
existan elementos de entrada.
Cabe hacer mention que es comun que la ordenacion se realiza en el mismo arreglo de
entrada, esto para evitar uso adicional de memoria; la ordenacion se realiza iterando el
arreglo de entrada, haciendo que la lista ordenada crezca al inicio de el. En cada posicion
del arreglo, se verifica el valor de esa posicion contra el valor mas alto de la lista ya
ordenada. Si es mayor, deja el elemento en lugar y se mueve al siguiente. Si es menor,
encuentra la posicion correcta dentro de la lista ordenada, y mueve todos los valores mas
grandes para hacer espacio para insertar el valor en la posicion correcta.
Para el pseudocodigo, por simplicidad se omite la llamada desde una rutina main,
llenado del arreglo, y mostrar el arreglo ordenado.
1. Inicio de rutina de ordenacion (parametros: variable arreglo con valores
a ordenar pasado por referencia)
2. Declara variables indice indice, indice_previo, cantidad._elementos y
valor_actual
cantidad._elementos <- cantidad de elementos en arreglo
indice <- 1
for indice < cantidad._elementos - 1
valor_actu.al = arreglo [indice]
indice_previo <- indice 1
while indice_previo >= 0 and arreglo[indice_previo] > valor_actu.al
arreglo [indice] <- arreglo [indice_previo]
indice_previo <- indice_previo 1
end-while
arreglo[indice] <- valor
end-for
3. retorna a funcion principal
4. Fin
Pseudocodigo de algoritmo de ordenamiento por insercion
Diagrama de flujo de algoritmo de ordenamiento por insercion
#include <stddef.h>
#include <stdio.h>
void ordenacion_insercion (int *arreglo,
const size_t cam.tidad_elementos)
i {
size t indice, indice previo;
int value;
for (indice = 1; indice < cantidad_eleraentos; indice++)i
i {
value = arreglo [indice];
for (indice_previo = indice; indice_previo > 0 && value < arreglo[indice_previo - 1]; indice_previo )
i i arreglo[indice previo] = arreglo[indice previo - 1];
arreglo[indice_previo] = value;
}
}
int main(void)
If
int indice, cantidad_elementos;
/* define con !& */
int arreglo[] = (4, 65, 2, -31, 0, 99, 2, 33, 732, 1};
/ * ) */
cantidad_elementos = sizeof arreglo / sizeof arreglo[0];
ordenacion_insercion (arreglo, cantidad_eleraentos) ;
for (indice = 0; indice < camtidad_elementos; indice++)
printf("%d arreglo [indice] )< ;
print f (
rr
\n
rr
) ;
return 0;
}
Implementacion en C de algoritmo de ordenamiento por insercion
Al compilar el programa y ejecutarlo nos muestra el arreglo ordenado ascendentemente:
cri sto. al am" 5@fliMmal2rd422l0B
5 ./a.exe
-31 0 1 2 2 4 65 83 99 7G2
Ejecucion de programa compilado de algoritmo de ordenamiento por insercion
c. Reescribe el procedimiento de Ordenamiento por Insercion del ejercicio
anterior para que lo ordene de forma decreciente.
i. Construye las nuevas representaciones (pseudocodigo y diagrama
de flujo).
ii. Programa el codigo para que acepte un valor de seleccion que
determine la entrega del resultado (orden creciente o decreciente
seleccionable en pantalla).
Para el pseudocodigo, por simplicidad se omite la llamada desde una rutina main,
llenado del arreglo, y mostrar el arreglo ordenado, a diferencia del paso anterior se hace
que los elementos se corran si son mayores y no menores (se subraya la diferencia del
programa previo).
5. Inicio de rutina de ordenacion (parametros: variable arreglo con valores
a ordenar pasado por referencia)
6. Declara variables indice indice, indice_previo, cantidad._elementos y
valor_actual
cantidad._elementos <- cantidad de elementos en arreglo
indice <- 1
for indice < cantidad._elementos - 1
valor_actu.al = arreglo [indice]
indice_previo <- indice 1
while indice_previo >= 0 and arreglo[indice_previo] > valor_actu.al
arreglo [indice] <- arreglo [indice_previo]
indice_previo <- indice_previo 1
end-while
arreglo[indice] <- valor
end-for
7. retorna a funcion principal
8. Fin
Pseudocodigo de algoritmo de ordenamiento por insercion en orden descendente
Diagrama de flujo de algoritmo de ordenamiento por insercion en orden descendente
# include < stddef.h>
#include <stdio.h>
void ordenacion_insercion (int *arreglo, const size_t cantidad_elementos, const int opcion)
{
size_t indice, indice_previo;
int value;
for (indice = 1; indice < cantidad_elementos; indice++)
{
value = arreglo [indice];
if (opcion = 0)
for (indice_previo = indice; indice_previo > 0 && value < arreglo[indice_previo
arreglo[indice_previo] = arreglo[indice_previo - 1];
else
for (indice_previo = indice; indice_previo > 0 && value > arreglo[indice_previo
arreglo[indice_previo] = arreglo[indice_previo - 1];
arreglo[indice_previo] = value;
}
}
int main(void)
{
int indice, cantidad_elenientos, opcion_seleccionada;
/* define con */
int arreglo[] = {4, 5, 2, -31, 0, 99, 2, 33, 732, 1};
cantidad_elementos = sizeof arreglo / sizeof arreglo[0];
printf (".SSwSfifiiSSS \n\n0. sxSSJVSS gSSS^JSSSSX^l SSaSSSJjSSiS'-.ti:
scanf {"%d
rr
, &opcion_seleccionada) ;
ordenacion_insercion (arreglo, cantidad_e1ementos, opcion_seleccionada);
for (indice = 0 ; indice < cantidad_elementos; indice++)
printf("%d ", arreglo[indice]);
printf ("\n");
return 0;
}
Implementacion en C de algoritmo de ordenamiento por insercion ascendente o
descendente
Al compilar el programa y ejecutarlo nos pregunta el orden y da el arreglo ordenado
apropiadamente:
cristo.alanis@mxnal2rd422103 ~
$ ./a.exe
Seleccione la opcion:
0. ordenar ascendente
1. ordenar descendente
: 0
-31 0 1 2 2 4 65 83 99 782
cristo. alanis@mxinal2rd422103 ~
S . f a, . exe
Seleccione la opcion:
0. ordenar ascendente
1. ordenar descendente
: 1
782 99 83 65 4 2 2 1 0 -31
Ejecucion de programa compilado de algoritmo de ordenamiento por insercion
ascendente o descendente
- 1] ; indice_previo )
- 1] ; indice_previo )
Referencia:
http://es.wikipedia.org/wiki/Ordenamiento por inserci%C3%B3n

Vous aimerez peut-être aussi