You are on page 1of 21

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 1

UNIVERSIDAD CATLICA DE SANTA MARA PROGRAMA PROFESIONAL DE INGENIERA DE SISTEMAS

SESIN 12:

ORDENACIN Y BSQUEDA. Parte I


I OBJETIVOS
Explicar los principales mtodos de ordenamiento. Explicar los principales mtodos de bsqueda. Aplicar mtodos de ordenamiento y bsqueda a la solucin de problemas reales.

II TEMAS A TRATAR
Mtodo de ordenacin por Intercambio. Mtodo de ordenacin por Insercin. Mtodo de ordenacin Burbuja. Mtodo de ordenacin por seleccin.

III MARCO TEORICO


ORDENACIN La ordenacin de los datos consiste en disponer un conjunto de datos (o una estructura) en algn determinado orden con respecto a alguno de sus campos. Orden: Relacin de una cosa con otra. Clave: Campo por el cual se ordena. Segn donde estn almacenados los datos a Ordenar, podemos decir que la Ordenacin es: Interna: Arrays, listas o rbol. Tpicamente en RAM. Externa: En Archivos en discos o cintas. ORDEN Una lista de datos est ordenada por la clave k si la lista est en orden con respecto a la clave anterior.

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 2

Este Orden puede ser: Ascendente: (i<j) entonces (k[i]<=k[j]) {nuestros ej} Descendente: (i>j) entonces (k[i]>=k[j]) Hay Numerosos Mtodos de Ordenamiento que difieren en eficiencia. Anlisis de algoritmo orientado a las comparaciones realizadas por cada uno. Las comparaciones sern funcin de n. Siendo n el tamao del vector a Ordenar. CLASIFICACIN DE MTODOS DE ORDENACIN Todos los mtodos se vern con Orden Ascendente. Analizaremos los siguientes mtodos: Bsicos: Son eficaces en Listas pequeas - Burbuja e Intercambio: simple pero Ineficiente. - Insercin: Recomendado. Avanzados: Son eficaces en Listas grandes. - Shell: muy extendido. ORDENACIN POR INTERCAMBIO El ms sencillo de todos. Se basa en: la lectura sucesiva de la lista a ordenar, comparando el elemento inferior de la lista con todos los restantes. Efectuando el Intercambio de posiciones cuando el orden resultante no sea correcto. Siendo n la cantidad de elementos, Realizar al menos n1 pasadas. ORDENACIN POR INTERCAMBIO: EJEMPLO Ordenar la siguiente secuencia de nmeros: 8, 4, 6, 2 SOLUCIN Pasada 0: Se compara a[0] con todos, as primero se cambia a[0] con a[1] pues a[0] > a[1] y debe ser Ascendente, es decir a[0]<a[1] y por ultimo a[0] con a[3]

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 3

Pasada 1: El elemento mas pequeo esta en a[0] y se analiza la sublista restante. Al cabo de la pasada, el segundo mas chico esta en a[1].

Pasada 2:

Pasada i: Al cabo de la pasada i, el elemento de orden i, est en a[i]


ORDENACIN POR INTERCAMBIO: CODIFICACIN EN C/C++

void ordIntercambio (int a[], int n)

{ int i, j, aux; /* se realizan n-1 pasadas, a[o] ... a[n-2] */ for (i = 0 ; i <= n-2 ; i++)/* coloca mnimo de a[i+1]...a[n-1] en a[i] */ for (j = i+1 ; j <= n-1 ; j++) if (a[i] > a[j]) { aux = a[i]; a[i] = a[j]; a[j]= aux ; } }

Complejidad (n1)(n2) Del Orden F(n)=n2.


Intercambio.cpp
#include<iostream.h> #include<stdlib.h> #define N 4 void ordIntercambio (int a[], int n) { int i, j, aux; /* se realizan n-1 pasadas, a[o] ... a[n-2] */ for (i=0;i<=n-2;i++)/* coloca minimo de a[i+1]...a[n-1] en a[i] */ for (j=i+1;j<=n-1;j++) if (a[i] > a[j]) { aux=a[i]; a[i]=a[j]; a[j]=aux; } }

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 4

void mostrar(int a[],int n) { int i; for(i=0;i<n;i++) { cout<<a[i]<<","; } } int main(char *arg) { int v[]={8, 4, 6, 2}; ordIntercambio(v,N); mostrar(v,N); cout<<endl<<endl; system("PAUSE");; return 0; } Presione F5

o haga clic en

PROPUESTOS Ordenar manualmente usando el mtodo de Intercambio la siguiente secuencia.

10, 5, 2, 6, 7, 3, 8, 9,14,34,11,1,4

ORDENACIN POR INSERCIN


Similar al proceso de ordenar tarjetas en un tarjetero por orden alfabtico: Consiste en insertar un elemento en su posicin correcta, dentro de una lista que ya est Ordenada. Algoritmo: El 1er elemento a[0] se lo considera ordenado Se inserta a[1] en la posicin correcta, delante o detrs del a[0], segn sea mayor o menor Por cada bucle i (desde i=1 hasta n1) se explora la sublista a[0]..a[i1] buscando la posicin correcta de insercin del elemento a[i] Al dejar vaco la posicin a[i] se impone un desplazamiento de todo el vector, desde el lugar de insercin. ORDENACIN POR INSERCIN: EJEMPLO Ordenar la siguiente secuencia de nmeros: 85, 87, 81,4, 22, 71, 78

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 5

SOLUCIN

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 6

ORDENACIN POR INSERCIN: CODIFICACIN EN C/C++

void ordInsercion (int [] a, int n)


{ int i, j, aux; for (i = 1; i < n; i++) // El ndice j explora sublista a[i-1]..a[0] { // buscando posicin correcta del elemento destino, para asignarlo en a[j] */ j = i; aux = a[i]; /* se localiza el punto de insercin explorando hacia abajo */ while (j > 0 && aux < a[j-1]) /* desplazar elementos hacia arriba para hacer espacio */ { a[j] = a[j-1]; j--; } a[j] = aux; } }

Complejidad n(n1) Del Orden F(n)=n2.


Insercion.cpp
#include<iostream.h> #include<stdlib.h> #define N 4 void ordInsercion(int a[],int n) { int i, j, aux; for (i = 1; i < n; i++) // El ndice j explora sublista a[i-1]..a[0] { // buscando posicin correcta del elemento destino, para asignarlo en a[j] */ j = i; aux = a[i]; // se localiza el punto de insercin explorando hacia abajo while (j > 0 && aux < a[j-1]) /* desplazar elementos hacia arriba para hacer espacio */ { a[j] = a[j-1]; j--; } a[j] = aux; } } void mostrar(int a[],int n) { int i; for(i=0;i<n;i++) { cout<<a[i]<<","; } } int main(char *arg) { int v[]={8, 4, 6, 2}; ordInsercion(v,N); mostrar(v,N); cout<<endl<<endl; system("PAUSE");; return 0; }

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 7

Presione F5 o haga clic en

PROPUESTOS Ordenar manualmente usando el mtodo de Insercin la siguiente secuencia.

10, 5, 2, 6, 7, 3, 8, 9,14,34,11,1,4

ORDENACIN POR BURBUJA


Los elementos burbujean: Los mas grandes, caen al fondo del array (posicin n) Los mas chicos suben a la cima (posicin 0). Estudia parejas de elementos Adyacentes a[0] y a[1], a[1] y a[2]a[i] y a[i+1] a[n2] y a[n1]. Si a[i+1] < a[i] Entonces Los INTERCAMBIA Algoritmo: Pasada 0: considera desde (a[0], a[1]) hasta (a[n2], a[n1]). En a[n1] esta el elemento mas grande. Pasada 1: considera desde (a[0], a[1]) hasta (a[n3], a[n2]). En a[n2] esta el segundo elemento mas grande. Pasada i: considera desde (a[0], a[1]) hasta (a[ni2], a[n-i1]). En a[ni1] esta el elemento de orden i. El proceso termina con la pasada n1 El elemento mas pequeo esta en a[0]. ORDENACIN POR BURBUJA: EJEMPLO Ordenar la siguiente secuencia de nmeros: 50, 20, 40, 80, 30

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 8

SOLUCIN Pasada 0:

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 9

ORDENACIN POR BURBUJA: CODIFICACIN EN C/C++ void ordBurbuja (int a[], int n) { int interruptor = 1; int pasada, j; for (pasada=0;pasada<n-1 && interruptor;pasada++) { long aux;/* bucle externo controla la cantidad de pasadas */ interruptor = 0; for (j = 0; j < n-pasada-1; j++) if (a[j] > a[j+1]) /* elementos desordenados, es necesario intercambio */ { interruptor = 1; aux = a[j]; a[j] = a[j+1]; a[j+1] = aux; } } }

Mejor Caso: en una lista ordenada, har una sola pasada: F(n)=n Peor Caso: F(n)=n2
Burbuja.cpp
#include<iostream.h> #include<stdlib.h> #define N 5 void ordBurbuja (int a[], int n) { int interruptor = 1; int pasada, j; for (pasada=0;pasada<n-1 && interruptor;pasada++) { long aux;/* bucle externo controla la cantidad de pasadas */ interruptor = 0; for (j = 0; j < n-pasada-1; j++) if (a[j] > a[j+1]) /* elementos desordenados, es necesario intercambio */ { interruptor = 1; aux = a[j]; a[j] = a[j+1]; a[j+1] = aux; } } } void mostrar(int a[],int n) { int i; for(i=0;i<n;i++) { cout<<a[i]<<","; } } int main(char *arg) { int v[]={50, 20, 40, 80, 30}; ordBurbuja(v,N) ; mostrar(v,N); cout<<endl<<endl; system("PAUSE");; return 0; } Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C. Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 10

Presione F5

o haga clic en

PROPUESTOS Ordenar manualmente usando el mtodo de Burbuja la siguiente secuencia.

10, 5, 2, 6, 7, 3, 8, 9,14,34,11,1,4

ORDENACIN POR SELECCIN


En cada paso seleccionamos el elemento de menor valor de los no ordenados y lo colocamos como primero de los no ordenados:

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 11

Para i=1 hasta n-1 hacer Asignar a k el menor valor de v[i..n] Intercambiar v[i] con v[k] Fpara

void ordSeleccion (int A[], int n) { int minimo=0, temp=0; for(int i=0 ; i<n-1 ; i++) { minimo=i; for(int j=i+1 ; j<n ; j++) { if (A[minimo] > A[j]) minimo=j; } temp=A[minimo]; A[minimo]=A[i]; A[i]=temp; } }

Seleccion.cpp
#include<iostream> #include<stdlib.h> #define N 5 using namespace std; void ordSeleccion (int A[], int n) { int minimo=0, temp=0; for(int i=0 ; i<n-1 ; i++) { minimo=i; for(int j=i+1 ; j<n ; j++) { if (A[minimo] > A[j]) minimo=j; } temp=A[minimo]; A[minimo]=A[i]; A[i]=temp; } } Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C. Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I void mostrar(int a[],int n) { int i; for(i=0;i<n;i++) { cout<<a[i]<<","; } } int main(char *arg) { int v[]={50, 20, 40, 80, 30}; ordSeleccion(v,N) ; mostrar(v,N); cout<<endl<<endl; system("PAUSE");; return 0; } PROPUESTOS Ordenar manualmente usando el mtodo de Seleccin la siguiente secuencia.

Pgina 12

10, 5, 2, 6, 7, 3, 8, 9,14,34,11,1,4

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 13

IV
(La prctica tiene una duracin de 4 horas)

ACTIVIDADES

1. Analizar el procedimiento de ordenacin de cada uno de los mtodos a travs de la siguiente aplicacin Java http://www.cs.oswego.edu/~mohammad/classes/csc241/samples/sort/Sort2-E.html

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 14

2. Verificar el tiempo de ejecucin de los siguientes mtodos de bsqueda http://www.cs.rit.edu/~atk/Java/Sorting/sorting.html

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 15

3. Verificar la cantidad de comparaciones que efectua los diferentes mtodos de ordenamiento http://maven.smith.edu/~thiebaut/java/sort/

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 16

4. Bsqueda Binaria http://euler.slu.edu/~goldwasser/demos/BinarySearch/

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I 5. Bsqueda Lineal http://www.cosc.canterbury.ac.nz/mukundan/dsal/LSearch.html

Pgina 17

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 18

6. Bsqueda Binaria http://www.cosc.canterbury.ac.nz/mukundan/dsal/BSearch.html

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 19

V EJERCICIOS
1. Desarrolle un programa el lenguaje ANSI C que dados dos arreglos A y B cada uno con 10 elementos: Llene los arreglos A y B. Ordene ascendentemente A y B por los mtodos de intercambio, insercin, burbuja y seleccin. Mezcle ordenadamente los elementos de A y B en un arreglo C el cual no debe contener elementos repetidos. 2. Dado un arreglo de tamao 30 que almacena nmeros reales, desarrolle un programa el lenguaje ANSI C que llene el arreglo. Adems, debe permitir ordenar los elementos que estn en las posiciones pares en forma ascendente y los elementos que estn en las posiciones impares en forma descendente utilizando el algoritmo de seleccin. Observaciones: No utilice otro arreglo para dejar ordenado los elementos. No ordene los valores al momento de ingresarlos. 3. En los algoritmos Burbuja o Seleccin, el elemento ms pequeo de a[i..n] es colocado en la posicin i mediante intercambios, para valores sucesivos de i. Otra posibilidad es colocar el elemento mximo de a[1..j] en la posicin j, para valores de j entre n y 1. A este algoritmo se le denomina ordenacin por Ladrillos (Bricksort). Implementar dicho algoritmo y estudiar su complejidad. 4. Una variante curiosa de los algoritmos anteriores resulta al combinar los mtodos de la Burbuja y de los Ladrillos. La idea es ir colocando alternativamente el mayor valor de a[1..j] en a[j], y el menor valor de a[i..n] en a[i]. Implementar dicho algoritmo, conocido como Sacudidas (Shakersort), y estudiar su complejidad. 5. Modificar el algoritmo de ordenacin por Seleccin de forma que se intercambien los elementos nicamente si son distintos. Qu impacto tiene esta modificacin sobre la complejidad del algoritmo? 6. Se da un arreglo que contiene N nmeros. Se desea determinar si hay 2 nmeros dentro del arreglo cuya suma sea igual a un nmero dado K. Por ejemplo, si la entrada es 8, 4, 1, 6, y K es 10, entonces la respuesta es s (4 y 6). Un nmero puede ser utilizado dos veces. De un algoritmo de tiempo O(NlogN) para resolver este problema (Pista: ordene los elementos primero. Despus de hacer esto, se podr resolver este problema en tiempo lineal). 7. El problema del k-simo elemento: Dado un vector de enteros, queremos encontrar el elemento que ocupara la posicin k si el vector estuviera ordenado en orden creciente (esto es, el k-simo menor elemento). Una primera idea para resolver este problema consiste en ordenar primero el
Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C. Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 20

vector y despus escoger el elemento en la posicin k, pero la complejidad de este algoritmo es O(nlogn). Puede hacerse de alguna forma ms eficiente? Considerar la siguiente idea: Ordenar el vector slo hasta la posicin k, utilizando un mtodo incremental como el de Seleccin. 8. Modificar el algoritmo bubble-sort, de tal manera que d el comportamiento requerido en las siguientes grficas. Verificar experimentalmente que la modificacin disminuye el tiempo de ordenamiento. Original Modificado: es ms rpido. Original Modificado: es ms rpido

VI CUESTIONARIO
1. Cuales son los mtodos de bsqueda que conoces? Cul es el mejor? 2. Cules son los rdenes de las complejidades de cada uno de los mtodos de ordenacin y bsqueda vistos en esta prctica? Cul es el menos complejo?

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

Laboratorio de Algoritmia y Estructura de Datos I

Pgina 21

VII BIBLIOGRAFIA Y REFERENCIAS


BIBLIOGRAFA BSICA D.S.Malik, DATA STRUCTURES USIGN C++, Thomson Learning, 2003 J. Galve. ALGORITMIA, Ed.Adisson Wesley, Espaa, 2000. Brassard, ANLISIS DE ALGORITMOS, Ed. Mc. Graw Hill., Espaa, 1999., BIBLIOGRAFA COMPLEMENTARIA Wirth M., ALGORITMOS Y ESTRUCTURA DE DATOS, Ed. Addison Wesley, Mxico, 1997 Aho. DISEO Y ANLISIS DE ALGORITMOS, Ed. Addison Wesley. USA, 1999. Deitel & Deitel COMO PROGRAMAR EN C/C++. Editorial Prentice Hall, 1995.

Mgter. Carlo Corrales D. - Mgter. Karim Guevara P. - Mgter. Juan P. Apaza C.

Sesin 12

You might also like