1. Universidad Fermín Toro
Vicerrectorado Académico
Decanato de Ingeniería
Alumno:
Reny Galaviz
CI: 19.105.449
Jaime Marin
CI:20017468
Cabudare, Julio 2015
Análisis de Algoritmo
2. Método de Burbuja
El método de ordenamiento por intercambio directo o
método de la burbuja, es el mas simple y consiste en
comparar dos elementos adyacentes para determinar si
se realiza un intercambio entre los mismos, esto en caso
de que el primero sea mayor que el segundo (forma
ascendente) o el caso de que el primero sea menor que
el segundo (forma descendente).
Procedimientos
Primer Procedimiento es:
Generar un ciclo que inicie desde uno hasta el numero
de elementos del arreglo.
Generar un segundo ciclo dentro del anterior que inicie
desde cero hasta el numero de elementos del arreglo
menos dos.
Dentro del segundo ciclo debe existir una
comparación que determina el tipo de ordenamiento
(ascendente o descendente) entre el primer elemento
(posición generado por el segundo ciclo) y el segundo
elemento (el que le sigue), si la respuesta a la condición
es verdadera se realiza un intercambio entre los dos
elementos.
Para realizar el intercambio se genera un
almacenamiento temporal, el cual guarda el dato del
primer elemento, el segundo elemento toma el lugar
del primero y en el lugar del segundo se coloca lo que
contiene el almacenamiento temporal.
Segundo Procedimiento es:
Generar un ciclo que inicie desde cero hasta el
número de elementos menos dos.
Generar un segundo ciclo desde el valor del
ciclo anterior mas uno hasta el número de
elementos menos uno.
Dentro del segundo ciclo debe existir una
comparación que determina el tipo de
ordenamiento (ascendente o descendente) entre
el primer elemento (posición generada por el
primer ciclo) y el segundo elemento (posición
generada por el segundo ciclo), si la respuesta a
la condición es verdadera se realiza un
intercambio entre los dos elementos.
Para realizar el intercambio se genera un
almacenamiento temporal, el cual guarda el dato
del primer elemento, el segundo elemento toma
el lugar del primero y en el lugar del segundo se
coloca lo que contiene el almacenamiento
temporal.
Tercer Procedimiento es :
Generar un ciclo que inicie desde uno hasta
el número de elementos menos uno.
Generar un segundo ciclo que inicie desde
el número de elementos menos uno y
mientras que ese valor sea mayor o igual al
del ciclo anterior (con decrementos).
Dentro del segundo ciclo debe existir una
comparación que determina el tipo de
ordenamiento (ascendente o descendente)
entre el primer elemento (posición generada
por el segundo ciclo) y el segundo elemento
(posición generada por el segundo ciclo
menos uno), si la respuesta a la condición es
verdadera se realiza un intercambio entre los
dos elementos.
Para realizar el intercambio se genera un
almacenamiento temporal, el cual guarda el
dato del primer elemento, el segundo
elemento toma el lugar del primero y en el
lugar del segundo se coloca lo que contiene el
almacenamiento temporal
Ventajas
Bastante Sencillo y mas utilizado por
su fácil comprensión y programación
Código reducido
Eficaz
Desventajas
Consume bastante tiempo de
computadora
Requiere de muchas
lecturas/escritura en memoria.
3. Método de QuickSort
El método de ordenamiento rápido o método quicksort, es
una técnica basada en otra conocida con el nombre divide y
vencerás, que permite ordenar una cantidad de elementos en
un tiempo proporcional a n2 en el peor de los casos o a n log
n en el mejor de los casos. El algoritmo original es recursivo,
como la técnica en la que se basa.
La descripción del algoritmo para el
método de ordenamiento quicksort es la
siguiente:
Debe elegir uno de los elementos del arreglo
al que llamaremos pivote.
Debe acomodar los elementos del arreglo a
cada lado del pivote, de manera que del lado
izquierdo queden todos los menores al pivote y
del lado derecho los mayores al pivote;
considere que en este momento, el pivote ocupa
exactamente el lugar que le corresponderá en el
arreglo ordenado.
Colocado el pivote en su lugar, el arreglo
queda separado en dos sub-arreglos, uno
formado por los elementos del lado izquierdo
del pivote, y otro por los elementos del lado
derecho del pivote.
Repetir este proceso de forma recursiva para
cada sub-arreglo mientras éstos contengan más
de un elemento. Una vez terminado este
proceso todos los elementos estarán ordenados.
Para elegir un pivote se puede aplicar
cualquiera de las siguientes tres
opciones:
El pivote será el primer elemento del
arreglo
El pivote será el elemento que esta a la
mitad del arreglo.
Que el pivote se elija de entre tres
elementos del arreglo (cualesquiera), los
cuales se deben comparar para seleccionar
el valor intermedio de los tres y
considerarlo como el pivote.
La forma o técnica de reacomodo de los elementos del
lado izquierdo y derecho del pivote, aplica el siguiente
procedimiento que es muy efectivo. Se utilizan dos
índices: izq, al que llamaremos índice inicial, y der, al
que llamaremos índice final. Conociendo estos
elementos el algoritmo quedaría de la siguiente manera:
Recorrer el arreglo simultáneamente con izq y der: por la
izquierda con izq (desde el primer elemento), y por la derecha
con der (desde el último elemento).
Mientras el arreglo en su posición izq (arreglo[izq]) sea
menor que el pivote, continuamos el movimiento a la derecha.
Mientras el arreglo en su posición der (arreglo[der]) sea
mayor que el pivote, continuamos el movimiento a la
izquierda.
Terminando los movimientos se compara los índices y si
izq es menor o igual al der, se intercambian los elementos en
esas posiciones y las posiciones se cambian izq a la derecha y
der a la izquierda.
Repetir los pasos anteriores hasta que se crucen los índices
(izq sea menor o igual a der).
El punto en que se cruzan los índices es la posición
adecuada para colocar el pivote, porque sabemos que a un
lado los elementos son todos menores y al otro son todos
mayores (o habrían sido intercambiados).
Ventajas
Muy rápido.
No requiere memoria adicional.
Desventajas
Implementación un poco mas complicada.
Recursividad (utiliza muchos recursos).
Mucha diferencia entre el peor y el mejor
caso.
4. Método de ShellSort
El método de ordenación shellsort es una versión mejorada del
método de ordenación por inserción directa, que se utiliza
cuando el número de elementos es grande. Este método recibe
su nombre gracias a su creados Donald L. Shell, también se
conoce con el nombre inserción con incrementos decrecientes.
El procedimiento para aplicar el algoritmo de shellsort es el siguiente:
Generar un ciclo que se encargue de
controlar el tamaño que deben tener los
incrementos.
Este ciclo debe iniciar con la división del
tamaño del arreglo entre dos.
Mientras que el incremento sea mayor a
cero debe continuar.
Y el cambio de incremento se elige de
entre dos opciones: un uno o la división del
incremento anterior entre dos.
Un segundo ciclo dentro del anterior, controla
el número de comparaciones que se deben hacer
según el tamaño del incremento.
El control de este ciclo debe iniciar con el
incremento generado anteriormente.
Mientras el control del ciclo sea menor que el
tamaño del arreglo.
El control debe cambiar de uno en uno.
Un tercer ciclo dentro del segundo controla
en que momento se detienen las
comparaciones o se hacen los posibles
intercambios entre los elementos.
El control de este ciclo debe iniciar con el
valor del ciclo anterior.
Mientras que el control sea mayor o igual al
incremento del primer ciclo y el elemento del
arreglo de la posición del control de este ciclo
menos el incremento, sea mayor que el
elemento del arreglo de la posición control de
este ciclo, realice los intercambios entre estas
posiciones.
Y el control se decremente con el valor del
incremento.
Ventajas
No requiere memoria adicional
Mejor rendimiento que el método
de inserción clásico.
Desventajas
Implementación al confusa.
Realiza numerosas
comparaciones e intercambios.
5. Método de Inserción
El ordenamiento por inserción (insertion sort en inglés)
es una manera muy natural de ordenar para un ser humano,
y puede usarse fácilmente para ordenar un mazo de cartas
numeradas en forma arbitraria. Requiere O(n²) operaciones
para ordenar una lista de n elementos.
Inicialmente se tiene un solo elemento, que obviamente es
un conjunto ordenado. Después, cuando hay k elementos
ordenados de menor a mayor, se toma el elemento k+1 y se
compara con todos los elementos ya ordenados,
deteniéndose cuando se encuentra un elemento menor
(todos los elementos mayores han sido desplazados una
posición a la derecha) o cuando ya no se encuentran
elementos (todos los elementos fueron desplazados y este
es el más pequeño). En este punto se inserta el elemento
k+1 debiendo desplazarse los demás elementos.
Análisis del algoritmo
Estabilidad: Este algoritmo nunca intercambia
registros con claves iguales. Por lo tanto es
estable.
Requerimientos de Memoria: Una variable
adicional para realizar los intercambios.
Tiempo de Ejecución: Para una lista de n
elementos el ciclo externo se ejecuta n1 veces.
El ciclo interno se ejecuta como máximo una
vez en la primera iteración, 2 veces en la
segunda, 3 veces en la tercera,
Ventajas:
•Fácil implementación.
•Requerimientos mínimos de
memoria.
Desventajas:
•Lento.
•Realiza numerosas comparaciones.
Este también es un algoritmo lento, pero
puede ser de utilidad para listas que están
ordenadas o semiordenadas, porque en ese
caso realiza muy pocos desplazamientos.
6. Método de Selección
Funcionamiento
Buscar el mínimo elemento de la lista.
Intercambio con el primero
Buscar el mínimo en el resto de la lista
Intercambiarlo con el segundo.
Características :
Buscar el mínimo elemento entre una posición i y el
final de la lista.
Intercambiar el mínimo con el elemento de la
posición i
Ventajas
Fácil implementación.
No requiere memoria adicional.
Realiza pocos intercambios.
Rendimiento constante: poca diferencia
entre el peor y el mejor caso.
Desventajas
Lento.
Realiza numerosas
comparaciones.
El método de ordenamiento por inserción es un
método sumamente sencillo el cual puede usarse
para ordenar un arreglo usando un simple
algoritmo de comparación entre dos elementos,
los beneficios de este método es que su
aplicación en cualquier lenguaje es muy fácil al
ser una forma muy natural y fácil de comprender
para cualquier usuario.
El método de ordenamiento por inserción se
asimila mucho a su vez con el método de la
burbuja siendo al mismo tiempo un poco mas
eficiente y compacto en cuanto código.
El ordenamiento de selección es un algoritmo de
ordenamiento que requiere n operaciones para
ordenar una lista de n elementos
7. Burbuja
#include<stdio.h>
#include<conio.h>
int a[3]={3,2,1};
int i,j,aux,n=3;
void main(){
clrscr();
for(i=0;i<=n;i++){
for(j=0;j<n-1;j++){
if(a[j]>a[j+1]){
aux=a[j];
a[j]=a[j+1];
a[j+1]=aux;
}
}
}
for(i=0;i<3;i++)
{
printf("%d",a);
}
getch();
}
Shell
#include<stdio.h>
#include<conio.h>
int a[5];
int n=5;
void main()
{
int
inter=(n/2),i=0,j=0,k=0,aux;
clrscr();
for (i=0; i<5; i++)
{
printf("INSERTA UN
VALOR DEL INDICE %d",
i);
scanf("%d",& a);
}
while(inter>0){
for(i=inter;i<n;i++)
{
j=i-inter;
while(j>=0) {
k=j+inter;
if(a[j]<=a[k]){
j--;
}
else{
aux=a[j];
a[j]=a[k];
a[k]=aux;
j=j-inter;
}
}
}
inter=inter/2;
}
for(i=0;i<5;i++)
{
printf("%d n",a);
getch();
}
}
Quicksort
int pivot(int *unarray, int
izq, int der) { int i; int
pivote, valor_pivote; int
aux; pivote = izq;
valor_pivote =
unarray[pivote]; for
(i=izq+1; i<=der; i++){ if
(unarray[i] <
valor_pivote){ pivote++;
aux=unarray[i];
unarray[i]=unarray[pivote
]; unarray[pivote]=aux; } }
aux=unarray[izq];
unarray[izq]=unarray[pivo
te]; unarray[pivote]=aux;
return pivote; } void
Quicksort(int *unarray, int
izq, int der) { int pivote;
if(izq < der){
pivote=pivot(unarray, izq,
der); Quicksort(unarray,
izq, pivote-1);
Quicksort(unarray,
pivote+1, der); } }
Inserción
#include<stdio.h>
#include<conio.h>
int a[4]={4,1,7,2};
int n=4;
int i,j,aux;
void main(){
clrscr();
for(i=1;i<n;i++)
{
j=i;
aux=a;
while(j>0 && aux<a[j-1])
{
a[j]=a[j-1];
j--;
}
a[j]=aux;
}
for(i=0;i<4;i++)
{
printf("%d",a);
}
getch();
}
Selección
#include<stdio.h>
#include<conio.h>
int x[4]={1,4,8,6};
int n=4,j=0,i=0;
int temp=0,minimo=0;
void main(){
clrscr();
for(i=0;i<n-1;i++)
{
minimo=i;
for(j=i+1;j<n;j++)
{
if(x[minimo] > x[j])
{
minimo=j;
}
}
temp=x[minimo];
x[minimo]=x;
x=temp;
}
for(i=0;i<n;i++)
{
printf("%d",x);
}
getch();
}