reny galaviz y jaime marin análisis de algoritmo

7
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

Upload: reny-galaviz

Post on 14-Aug-2015

79 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Reny Galaviz y Jaime Marin Análisis de Algoritmo

Universidad Fermín ToroVicerrectorado Académico

Decanato de Ingeniería

Alumno:Reny Galaviz CI: 19.105.449Jaime Marin CI:20017468

Cabudare, Julio 2015

Análisis de Algoritmo

Page 2: Reny Galaviz y Jaime Marin Análisis de Algoritmo

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.

Page 3: Reny Galaviz y Jaime Marin Análisis de Algoritmo

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.

Page 4: Reny Galaviz y Jaime Marin Análisis de Algoritmo

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 adicionalMejor rendimiento que el método

de inserción clásico.

Desventajas

Implementación al confusa.Realiza numerosas

comparaciones e intercambios.

Page 5: Reny Galaviz y Jaime Marin Análisis de Algoritmo

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.

Page 6: Reny Galaviz y Jaime Marin Análisis de Algoritmo

Método de Selección

Funcionamiento

Buscar el mínimo elemento de la lista.Intercambio con el primeroBuscar 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

Page 7: Reny Galaviz y Jaime Marin Análisis de Algoritmo

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[pivote]; 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(); }