informe de programacion
TRANSCRIPT
Pimentel – Chiclayo
FACULTAD DE ARQUITECTURA, INGENIERIA Y URBANISMO
ESCUELA PROFESIONAL DE INGENIERIA DE SISTEMAS
ASIGNATURA :
Fundamentos de Programación
DOCENTE :
Rosa América
ALUMNO :
MUÑOZ SEGURA Luis Enrique
CICLO :
I
Aula :
Lab Nª 20
Turno :
Mañana
Pimentel 23 de octubre del 2015
ContenidoI.
MARCO TEORICO:..................................................................................................................4
MÉTODOS DE BÚSQUEDA:...............................................................................................4
Tipos de métodos de búsqueda:.....................................................................................4
Método de búsqueda secuencial:....................................................................................4
Método de búsqueda binaria:..........................................................................................4
Métodos de ordenamiento:...............................................................................................5
Tipos de ordenamiento:....................................................................................................6
1.2 ORDENAMIENTO INTERNO:.......................................................................................6
1.2.1 Ordenamiento por intercambio (burbuja):.............................................................7
1.2.2 Algoritmo de burbuja mejorado:.............................................................................7
1.3 MÉTODO DE SELECCIÓN:..........................................................................................8
1.4 MÉTODO DE INSERCIÓN:...........................................................................................8
1.5 ORDENACIÓN SHELL:.................................................................................................9
1.6 ORDENAMIENTO POR MEZCLA (MERGE SORT)................................................10
1.7 Ordenación por partición e intercambio (Quick Sort):..............................................11
1.7 Ordenación basada en comparaciones (Heap Sort):...............................................13
ORDENAMIENTO EXTERNO:..........................................................................................13
1.2.1 Ordenación por mezcla directa:...........................................................................14
1.2.2 Ordenación por mezcla equilibrada:...................................................................14
2. EJEMPLOS:.........................................................................................................................15
3. CONCLUSIONES...............................................................................................................16
Bibliografía:..............................................................................................................................17
Resumen:
La operación de ordenar consisten seleccionar de un conjunto de datos y
ordenarlos bajo algún determinado criterio. Por ejemplo, cada elemento del
conjunto de datos de una guía telefónica tiene un nombre, una dirección y un
número de teléfono; la guía telefónica está dispuesta en orden alfabético de
nombres; los elementos numéricos se pueden ordenar en orden creciente o
decreciente de acuerdo al valor numérico del elemento. En terminología de
ordenación, el elemento por el cual esta ordenado un conjunto de datos (o se
está buscando) se denomina clave.
Una colección de datos (estructura) puede ser almacenada por ejemplo en un
array (vector o tabla). Una estructura se dice que esta ordenada por la clave k
si la lista está en orden ascendente o descendente con respecto a esta clave.
La colección de datos se dice que está en orden ascendente si: i <
jimplicaquek[i] <=k[j]. En cambio, está en orden descendente si: i >
jimplicaquek[i] <= k[j] para todos los elementos de la colección.
MARCO TEORICO:
MÉTODOS DE BÚSQUEDA:
Los métodos de búsqueda nos permiten recuperar información de un
vector o un archivo, que contenga una lista de datos. Por ejemplo se
puede obtener el nombre y el número telefónico de nuestra agenda de
contactos o la nota obtenida por un alumno en la lista de un curso.
Cuando se realizan búsquedas sobre vectores, se desea es encontrar la
posición que ocupa el elemento buscado dentro de la lista de elementos
que contiene el vector. Para la búsqueda de información en archivos es
necesario realizar la búsqueda a partir de un campo clave dentro del
archivo. Existen diferentes métodos de búsqueda y se puede determinar
con cual método trabajar dependiendo de la cantidad de elementos que
existan en el vector o la organización de dichos elementos.
Tipos de métodos de búsqueda:
Método de búsqueda secuencial:
Este método se usa para buscar un elemento de un vector, es
explorar secuencialmente el vector, es decir; recorrer el vector desde
el prior elemento hasta el último. Si se encuentra el elemento
buscado se debe visualizar un mensaje similar a “Fin de Búsqueda”
o “Elemento encontrado” y otro que diga “posición=” en caso
contrario, visualizar un mensaje similar a “Elemento no existe en la
Lista”.
Este tipo de búsqueda compara cada elemento del vector con el
valor a encontrar hasta que este se consiga o se termine de leer el
vector completo.
Método de búsqueda binaria:
Es un método que se basa en la división sucesiva del espacio
ocupado por el vector en sucesivas mitades, hasta encontrar el
elemento buscado.
Esta búsqueda utiliza un método de “divide y vencerás” para
localizar el valor deseado. Con este método se examina primero el
elemento central de la lista; si este es el elemento buscado entonces
la búsqueda ha terminado. En caso contrario se determina si el
elemento buscado está en la primera o segunda mitad de la lista y a
continuación se repite el proceso anterior, utilizando el elemento
central de esta sublista. Este tipo de búsqueda se utiliza en vectores
ordenados.
Métodos de ordenamiento:
Debido a que las estructuras de datos son utilizadas para almacenar
información, para poder recuperar esa información de manera eficiente es
deseable que aquella esté ordenada. Existen varios métodos para ordenar
las diferentes estructuras de datos básicas.
En general los métodos de ordenamiento no son utilizados con frecuencia,
en algunos casos sólo una vez. Hay métodos muy simples de implementar
que son útiles en los casos en dónde el número de elementos a ordenar no
es muy grande (ej, menos de 500 elementos). Por otro lado hay métodos
sofisticados, más difíciles de implementar pero que son más eficientes en
cuestión de tiempo de ejecución.
Los métodos sencillos por lo general requieren de aproximadamente n x n
pasos para ordenar n elementos.
Los métodos simples son: insertion sort (o por inserción directa) selection
sort, bubble sort, y shellsort, en dónde el último es una extensión al
insertion sort, siendo más rápido. Los métodos más complejos son el quick-
sort, el heap sort, radix y address-calculation sort. El ordenar un grupo de
datos significa mover los datos o sus referencias para que queden en una
secuencia tal que represente un orden, el cual puede ser numérico,
alfabético o incluso alfanumérico, ascendente o descendente.
Se ha dicho que el ordenamiento puede efectuarse moviendo los registros
con las claves. El mover un registro completo implica un costo, el cual se
incrementa conforme sea mayor el tamaño del registro. Es por ello que es
deseable evitar al máximo el movimiento de los registros. Una alternativa
es el crear una tabla de referencias a los registros y mover las referencias y
no los datos. A continuación se mostrarán los métodos de ordenamiento
empezando por el más sencillo y avanzando hacia los más sofisticados
La eficiencia de los algoritmos se mide por el número de comparaciones e
intercambios que tienen que hacer, es decir, se toma n como el número de
elementos que tiene el arreglo a ordenar y se dice que un algoritmo realiza
O(n2) comparaciones cuando compara n veces los n elementos, n x n = n2.
Tipos de ordenamiento:
La ordenación o clasificación de datos consiste en la disposición de
los mismos de acuerdo con algún valor o característica. Por ejemplo,
cada elemento de una agenda telefónica tiene un campo nombre, un
campo dirección y un campo número telefónico. Por lo regular los
datos en la agenda se encuentran organizados en un orden de la A
la Z. De la misma forma un lista ó vector de datos se dice que esta
ordenado de manera ascendente, si X [ i ] <= X [ i +1] y, por otro
lado, se dice que esta ordenado de manera descendente sí X [ i ] >=
X [ i +1].
El proceso de ordenación es uno de los mecanismos más
interesantes cuando llega el momento de mostrar que existen
múltiples soluciones para un mismo problema, y que cada solución
algorítmica tiene sus propias ventajas y desventajas.
Una forma de medir la eficiencia de un algoritmo de esta clase, es
verificar el número de comparaciones entre valores clave, además
del número de movimientos que se tengan que realizar entre
elementos (intercambios) de la lista.
Los métodos de ordenamiento que trabajan con estructuras de datos
residentes en memoria principal se denominan Ordenamientos
Internos, mientras que las implementaciones que utilizan estructuras
de datos residentes en archivos se conocen como Ordenamientos
externos.
1.2 ORDENAMIENTO INTERNO:
Los métodos de ordenamiento interno trabajan en memoria principal y
sus implementaciones son muy variadas, de manera que la elección del
algoritmo adecuado debe realizarse con criterios de eficiencia (tiempo y
ejecución) y en función de la memoria disponible. Dividiremos los
métodos en dos grandes grupos:
• Directos (burbuja, selección e inserción).
• Logarítmicos (Shell sort, Merge sort, Heap sort, Quick sort, Radix).
En el caso de listas pequeñas, los métodos directos se desempeñan de
manera relativamente eficientes, ya que la codificación del algoritmo
correspondiente no es compleja. Su uso es muy frecuente. Sin embargo,
en arreglos grandes las ordenaciones directas resultan ineficientes y se
necesitara un método logarítmico para su solución.
1.2.1 Ordenamiento por intercambio (burbuja):
Es uno de los métodos relativamente más sencillo e intuitivo, pero
también resulta ser muy ineficiente. Se basa en la ordenación por
cambio, y recibe su nombre de la semejanza con las burbujas de
un depósito de agua donde cada burbuja busca su propio nivel.
1.2.2 Algoritmo de burbuja mejorado:
Existe una versión mejorada de dicho algoritmo en donde se
integra una variable que funge como switch (bandera) que permite
detectar el momento en que ya no se presenten más intercambios
aunque su mejora no suele ser tan importante pues el algoritmo
sigue comportándose como una ordenación cuadrática O(n2).
void burbuja(int *v, int n) /*** código en C++ ***/{bool sw = true;int li = 0;do {li++;sw = true;for (int i = 0; i < n - li; i++) {if ( v[i] > v[i+1] ) { // compara los valores// intercambia los datosint tem = v[i];v[i] = v[i+1];v[i+1] = tem;sw = false;}}} while(!sw);
}
1.3 MÉTODO DE SELECCIÓN:
La idea básica es encontrar el elemento más pequeño (grande), en
orden ascendente de la lista, e intercambiarlo con el elemento que ocupa
la primera posición en la lista, a continuación se busca el siguiente
elemento más pequeño y se transfiere a la segunda posición. Se repite
el proceso hasta que el último elemento ha sido transferido a su posición
correcta.
El algoritmo de ordenación depende a su vez del algoritmo necesario
para localizar el componente mayor (menor) de un array. Es un proceso
muy similar al método de la burbuja pero haciendo más eficiente la
búsqueda y evitando intercambios innecesarios.
void seleccion( int * v, int n) /*** código en C++ ***/{/* ordenamiento de seleccion */for (int i = 0, j = 0, k = 0; i < n-1; i++) {k = i;for (j = i+1; j < n; j++)if ( v[k] > v[j] )k = j;int tem = v[i];v[i] = v[k];v[k] = tem;
}}
1.4 MÉTODO DE INSERCIÓN:
Este método también se denomina “método del jugador de cartas”, por la
semejanza con la forma de clasificar las cartas de una baraja, insertando
cada carta en el lugar adecuado.
El algoritmo ordena los dos primeros elementos de la lista, a
continuación el tercer elemento se inserta en la posición que
corresponda, el cuarto se inserta en la lista de tres elementos, y así
sucesivamente. Este proceso continua hasta que la lista este totalmente
ordenada.
void insercion( int * v, int n) /*** código en C++ ***/{/* ordenamiento de insercion */for (int i = 1, j = 0; i < n; i++) {int tem = v[i];j = i - 1;while ( j >= 0 && tem < v[j]) {v[j+1] = v[j];j--;}v[j+1] = tem;}
}
1.5 ORDENACIÓN SHELL:
Shell sort lleva este nombre en honor a su inventor, Donald Shell, que lo
publicó en 1959. La idea básica de este método es distribuir el arreglo de
manera que se genere una matriz de valores donde cada elemento es
comparado de manera adyacente empleando un mecanismo de
inserción directa simple, dicho rango que genera grupos de manera
matricial que es reducido gradualmente hasta estabilizarse en un valor
uniforme de 1.
En el método de ordenación por inserción directa es empleado en cada
sub grupo de manera que cada elemento se compara para su ubicación
correcta en el arreglo con los elementos que se encuentran en su parte
izquierda. Si el elemento a insertar es más pequeño que el grupo de
elementos que se encuentran a su izquierda, será necesario efectuar
varias comparaciones antes de su ubicación. Shell propone que las
comparaciones entre elementos se efectúen con saltos de mayor
tamaño, pero con incrementos decrecientes; así, los elementos
quedaran ordenados más rápidamente.
El algoritmo para Shell sort sería el siguiente. Algunos autores suponen
una secuencia geométrica de decremento (2.2) que permite una
distribución presumiblemente más razonable para el acomodo de los
grupos de elementos a comparar. El algoritmo emplea un arreglo a de 0
a n-1:
inc = round(n/2)mientras inc > 0 {para i = inc hasta n – 1 {temp = a[i]j = imientras j = inc && a[j - inc] > temp {a[j] = a[j - inc]j = j – inc}a[j] = temp}inc = round(inc / 2.2)}
1.6 ORDENAMIENTO POR MEZCLA (MERGE SORT)
Fue desarrollado en 1945 por John Von Neumann. Conceptualmente, el
ordenamiento por mezcla funciona de la siguiente manera:
1. Si la longitud de la lista es 0 ó 1, entonces ya está ordenada. En otro
caso:
2. Dividir la lista desordenada en dos sublistas de aproximadamente la
mitad del tamaño.
3. Ordenar cada sablista recursivamente aplicando el ordenamiento por
mezcla.
4. Mezclar las dos sublistas en una sola lista ordenada.
El ordenamiento por mezcla incorpora dos ideas principales para mejorar
su tiempo de ejecución:
Una lista pequeña necesitará menos pasos para ordenarse que
una lista grande.
Se necesitan menos pasos para construir una lista ordenada a
partir de dos listas también ordenadas, que a partir de dos listas
desordenadas. Por ejemplo, sólo será necesario entrelazar cada
lista una vez que están ordenadas.
1.7 Ordenación por partición e intercambio (Quick Sort):
Es un algoritmo relativamente eficiente y representa una mejora
sustancial al método de intercambio directo.
El algoritmo es el siguiente:
1. Elegir un elemento de la lista de elementos a ordenar (pivote).
2. Resituar los demás elementos de la lista a cada lado del pivote, de
manera que a un lado queden todos los menores que él, y al otro los
mayores.
Los elementos iguales al pivote pueden ser colocados tanto a su
derecha como a su izquierda, dependiendo de la implementación
deseada. En este momento, el pivote ocupa exactamente el lugar que le
corresponderá en la lista ordenada.
2. La lista queda separada en dos sub-listas, una formada por los
elementos a la izquierda del pivote, y otra por los elementos a su
derecha.
3. Repetir este proceso de forma recursiva para cada sub-lista mientras
éstas contengan más de un elemento. Una vez terminado este
proceso todos los elementos estarán ordenados.
Como se puede suponer, la eficiencia del algoritmo depende de la
posición en la que termine el pivote elegido. En el mejor caso, el pivote
termina en el centro de la lista, dividiéndola en dos sublistas de igual
tamaño. En este caso, el orden de complejidad del algoritmo es O(n log
n).
En el peor caso, el pivote termina en un extremo de la lista. El orden de
complejidad del algoritmo es entonces de O (n²). El peor caso dependerá
de la implementación del algoritmo, aunque habitualmente ocurre en
listas que se encuentran ordenadas, o casi ordenadas. Pero
principalmente depende del pivote, por ejemplo el algoritmo
implementado toma como pivote siempre el primer elemento del arreglo,
y el arreglo que le pasamos está ordenado, siempre va a generar a su
izquierda un arreglo vacío, lo que es ineficiente.
Ordenación basada en comparaciones (Heap Sort).
Es una variante del algoritmo de selección, El ordenamiento por
montículos (Heap sort) es un algoritmo de ordenación no recursivo, no
estable, con complejidad computacional O(n log n).
Este algoritmo consiste en almacenar todos los elementos del vector a
ordenar en un montículo (heap), y luego extraer el nodo que queda como
nodo raíz del montículo (cima) en sucesivas iteraciones obteniendo el
conjunto ordenado. Basa su funcionamiento en una propiedad de los
montículos, por la cual, la cima contiene siempre el menor elemento (o el
mayor, según se haya definido el montículo) de todos los almacenados
en él.
El significado de heap en computación es el de una cola de prioridades
(priority queue). Tiene las siguientes características:
Un heap es un arreglo de n posiciones ocupado por los elementos
de la cola.
Se mapea un árbol binario de tal manera en el arreglo que el nodo
en la posición i es el padre de los nodos en las posiciones (2*i) y
(2*i+1).
El valor en un nodo es mayor o igual a los valores de sus hijos. Por
consiguiente, el nodo padre tiene el mayor valor de todo su
subárbol.
1.7 Ordenación basada en comparaciones (Heap Sort):
Es una variante del algoritmo de selección, El ordenamiento por
montículos (Heap sort) es un algoritmo de ordenación no recursivo, no
estable, con complejidad computacional O(n log n).
Este algoritmo consiste en almacenar todos los elementos del vector a
ordenar en un montículo (heap), y luego extraer el nodo que queda como
nodo raíz del montículo (cima) en sucesivas iteraciones obteniendo el
conjunto ordenado. Basa su funcionamiento en una propiedad de los
montículos, por la cual, la cima contiene siempre el menor elemento (o el
mayor, según se haya definido el montículo) de todos los almacenados
en él.
El significado de heap en computación es el de una cola de prioridades
(priority queue). Tiene las siguientes características:
Un heap es un arreglo de n posiciones ocupado por los elementos de
cola.
Se mapea un árbol binario de tal manera en el arreglo que el nodo en
la posición i es el padre de los nodos en las posiciones (2*i) y (2*i+1).
El valor en un nodo es mayor o igual a los valores de sus hijos. Por
consiguiente, el nodo padre tiene el mayor valor de todo su subárbol.
ORDENAMIENTO EXTERNO:
La ordenación de archivos se lleva a cabo cuando el volumen de los
datos a tratar es demasiado grande y los mismos no caben en la
memoria principal de la computadora.
Al ocurrir esta situación no pueden aplicarse los métodos de ordenación
interna, de modo que debe pensarse en otro tipo de algoritmos para
ordenar datos almacenados en archivos.
Por ordenación de archivos se entiende, entonces, la ordenación o
clasificación de éstos, ascendente o descendentemente, de acuerdo con
un campo determinado al que se denominará campo clave. La principal
desventaja de esta ordenación es el tiempo de ejecución, debido a las
sucesivas operaciones de entrada y salida.
Los dos métodos de ordenación externa más importantes son los
basados en la mezcla directa y en la mezcla equilibrada.
1.2.1 Ordenación por mezcla directa:
El método de ordenación por mezcla directa es probablemente el
más utilizado por su fácil comprensión.
La idea central de este algoritmo consiste en la realización sucesiva
de una partición y una fusión que produce secuencias ordenadas de
longitud cada vez mayor. En la primera pasada la participación es de
longitud 1 y la fusión o mezcla produce secuencias ordenadas de
longitud 4.
Este proceso se repite hasta que la longitud de la secuencia para la
partición sea mayor o igual que la longitud de la secuencia para la
partición sea mayor o igual que el número de elementos del archivo
original.
Supóngase que se desean ordenar las claves del archivo F. Para
realizar tal actividad se utilizan dos archivos auxiliares a los que se
les denominará F1 y F2.
1.2.2 Ordenación por mezcla equilibrada:
El método de ordenación por mezcla equilibrada, conocido
también con el nombre de mezcla natural, es una optimización del
método de mezcla directa.
La idea central de este método consiste en realizar las particiones
tomando secuencias ordenadas de máxima longitud en lugar de
secuencias de tamaño fijo previamente determinadas. Luego
realiza la fusión de las secuencias ordenadas, alternativamente
sobre dos archivos aplicando estas acciones en forma repetida se
lograra que el archivo original quede ordenado. Para la realización
de este proceso de ordenación se necesitaran cuatro archivos. El
archivo original F y tres archivos auxiliares a los que se
denominaran F1, F2 y F3. De estos archivos, dos serán
considerados de entrada y dos de salida; esto, alternativamente,
con el objeto de realizar la fusión-partición. El proceso termina
cuando en la realización de una fusión-partición el segundo
archivo quede vacío.
2. EJEMPLOS:
Método de búsqueda secuencial:
Método de búsqueda binaria
Método de selección:
Método de inserción:
3. CONCLUSIONES:
Al realizar esta investigación nos ayuda a conocer cada una de los tipos
de métodos de búsqueda ya que al momento de hacer un programa
extenso podríamos utilizar algunos de estos métodos y así encontrar la
información más rápida y no perder tanto tiempo.
Al comparar con las demás definiciones y funciones de cada de los
métodos de búsqueda puede notar que este método es más eficiente y
entendible que los demás. Es el algoritmo conocido como quicksort
(ordenación rápida) recibe el nombre de su autor, Tony Hoare.
La idea del algoritmo es simple, se basa en la división en particiones de la
lista a ordenar, por lo que se puede considerar que aplica la técnica divide
y vencerás. El método es, posiblemente, el más pequeño de código, más
rápido, más elegante y eficiente de los algoritmos de ordenación
conocidos.
Bibliografía:
Y. Langsam, M. J. Augenstein, A. Tenenbaum. Data Structures using C and C++.
Prentice Hall,
Second edition. ISBN 0-13-036997-7.
http://en.wikipedia.org/wiki/Sorting_algorithm.