Está en la página 1de 22

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

INSTITUTO DE EDUCACION SUPERIOR TECNOLOGICO PRIVADO TEC .

METODOS DE ORDENAMIENTO Y BUSQUEDA

Mg . NILTON CESAR AYRA APAC

UCAYALI PERU 2011

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

METODOS DE ORDENAMIENTO Y BUSQUEDA


Muchas actividades humanas requieren que en ellas las diferentes colecciones de elementos utilizados se coloquen en un orden especfico. Las oficinas de correo y las empresas de mensajera ordenan el correo y los paquetes por cdigos postales con el objeto de conseguir una entrega eficiente; los anuarios o listines telefnicos ordenan sus clientes por orden alfabtico de apellidos con el fin ltimo de encontrar fcilmente el nmero de telfono deseado; Por esta circunstancia una de las tareas que realizan ms frecuentemente las computadoras en el procesamiento de datos es la ordenacin. El estudio de diferentes mtodos de ordenacin es una tarea intrnsecamente interesante desde un punto de vista terico y, naturalmente, prctico. En esta ocasin se estudia los algoritmos y tcnicas de ordenacin ms usuales y su implementacin en C++. De igual modo se estudiar el anlisis de los algoritmos utilizados en diferentes mtodos de ordenacin con el objetivo de conseguir la mxima eficiencia en su uso real. Cuando tenemos poca informacin es fcil manejar esta informacin pero cuando tenemos una buena cantidad de informacin las cosas cambian, tal es el caso por ejemplo si queremos pedir las notas de un alumno que tiene un cdigo determinado, si tenemos ordenados ser ms fcil ubicarlo a travs de un mtodo de bsqueda, para luego relacionarlo con sus notas, pero si no se tiene ordenado tendremos que empezar a buscar registro por registro y si nos imaginamos que tenemos ms de 3000 alumnos, cuanto tiempo creen que nos demoraremos?, por ello se dice que: todo lo que se ordena se puede controlar, todo lo que se controla se administra y todo lo que se administra se puede gerencia. Antes de comenzar a ver cada algoritmo tenemos que saber algunas terminologas importantes:

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

BASE DE DATOS Conjunto de datos clasificados, por ejemplo, tendremos una estructura que almacena los apellidos en una sola columna, los nombres en otra, los telfonos en otro, etc CAMPO Parte de la datos que identifica a un tipo de informacin que se almacenara en esa parte, por ejemplo en el campo telfono, solo se almacenaran nmeros telefnicos, Ud. no encontrara en ese campo los apellidos o nombres u otro dato distinto al telfono, adems ser de un tipo determinado, por ejemplo, numrico, carcter o lgico. Adems si se quiere ordenar una base de datos se tiene que escoger un campo, y en base a ese campo se procede a ordenar, no se puede escoger dos campos para ordenar, por ejemplo si se ordena por apellidos se proceder hacerlo alfabticamente, pero no se podr ordenar en el mismo instante por nmero de telfono. El campo seleccionado para proceder se llama ndice otros lo llaman clave. REGISTRO Es un conjunto de campos agrupandos, normalmente pertenecen a un solo elemento, en nuestro ejemplo a una sola persona, normalmente en un registro no se repiten los campos, no podremos tener un registro con dos campos de nombre telfono, lo que si podemos tener es un campo con nombre telfono y el otro telefono2. CRITERIO DE ORDENAMIENTO Es el algoritmo que usaremos para ordenar, por ejemplo podramos escoger ordenar por nmero de DNI pero en forma ascendente TIEMPO DE EJECUCION Es el tiempo que demora en ordenar, encontrar o mezclar los datos, cuando se tiene pocos registros no se ve mucho la diferencia, pero cuando se tiene miles de registros el tiempo de duracin es importarte, porque ser decisivo para decidir que algoritmo escoger, en nuestro caso diramos, el que haga menor cantidad de

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

comparaciones y/o interacciones ser el menos complejo, pero eso no significa que ser el mas rpido. USO DE MEMORIA Normalmente cuando la Base de Datos es pequea todo se hace en la memoria RAM y no se necesita acceder al disco duro, pero cuando tenemos una Base de Datos de miles de Registros en necesario usar el disco duro como memoria complementaria, por lo que la velocidad de procesamiento se ver afectado, por la velocidad de E/S de datos METODOS DE ORDENAMIENTO MS COMUNES Como ejercicios de aprendizaje veremos cuatro tipos de ordenamiento, los ms usados: Ordenamiento por Burbuja Ordenamiento por Seleccin Ordenamiento por Insercin Ordenamiento Rpido No necesariamente significa que el ms rpido es el que nos conviene, sino tenemos que evaluar, varios criterios como es: La cantidad de registros, si son pocas, normalmente no tienes mucho que hacer, no veras la diferencia en tiempos, porque uno frente al otro solo tomara segundos de diferencia Cantidad de memoria que necesita, hay algoritmos de ordenamiento que necesitan buena cantidad de memoria RAM, por lo que si nuestro equipo de cmputo tiene poca memoria, el algoritmo usara al disco duro como apoyo, por lo que se sabe que se har ms lento. Tipo Campo a ordenar, algunos mtodos de ordenamiento funcionan mejor si son numricos o alfabticos mientras que otros no tienen diferencia 1. ORDENAMIENTO POR BURBUJA Se le conoce tambin como ordenamiento por intercambio, es el algoritmo mas sencillo, su principio es comparando elementos adyacentes de dos en dos desde el inicio hasta el final, por lo que diramos que si el elemento actual es mayor que el que est en la siguiente posicin se intercambian.

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

Diagrama de Flujo
inicio

Repetir desde i = 1, hasta TAM, i mas 1

Repetir desde J=0, hasta TAM-1, j mas 1

5
si lista[j] > temp = lista[j] lista[j] = lista[j+1] lista[j+1] = temp

Fin

Pseudocdigo

for (i=1; i<TAM; i++) for (j=0 ; j<TAM - 1; j++) if (lista[j] > lista[j+1]) { temp = lista[j]; lista[j] = lista[j+1]; lista[j+1] = temp; }

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

Donde TAM i,j lista temp : : : : es la cantidad de elementos Contador tipo entero Es el arreglo a ordenar Variable temporal del mismo tipo de lo que se declaro lista

2. Ordenamiento por Seleccin. Este algoritmo consiste en buscar en toda el arreglo, el valor el registro que contenga el campo menor, luego intercambia con el elemento ubicado en la primera posicin de la lista, luego se busca el segundo elemento menor y se intercambia en la segunda posicin, y as sucesivamente se repite hasta que se haya ordenado toda la lista. Diagrama de Flujo:

inicio

Repetir desde i = 1, hasta TAM, i mas 1

Repetir desde J=1, hasta TAM, j mas 1

si lista[pos_men]>lista [j]

Pos_men=j

Temp=lista[i] Lista[i]=lista[pos_men] Lista[pos_men]=temp Pos_men=i+1

Fin

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

Mtodos de Ordenamiento y Bsqueda Peudocodigo

Comp. e Inf. - TEC

pos_men=0; for (i=0; i<TAM - 1; i++) {for (j=i;j<TAM;j++) If (lista[pos_men]>lista[j]) { pos_men =j: temp = lista[i]; } lista[i] = lista [pos_men]; lista [pos_men] = temp; pos_men=i+1; }
Donde TAM : i,j : lista : temp : pos_men : Es la cantidad de elementos Contador tipo entero Es el arreglo a ordenar Variable temporal del mismo tipo de lo que se declaro lista Posicin de la variable menor del arreglo lista

3.

Ordenamiento por Insercin Este algoritmo es al igual que los anteriores sencillo, el algoritmo es considerar una parte de la lista o del arreglo ya ordenada y luego se va colocando cada uno de los elementos que quedan en el lugar que le corresponde, este mtodo de ordenacin tambin se conoce como mtodo de la baraja, porque es como si estaramos jugando a las cartas, por ejemplo: como se hace para ordenar las cartas, si imaginamos que nos van dando las cartas de uno en uno, lo que hacemos es comparar luego lo ubicamos de acuerdo al valor, si es menor a la izquierda y si es mayor a la derecha, y as sucesivamente, voy insertando en el lugar donde corresponde

Mtodos de Ordenamiento y Bsqueda Diagrama de flujo:


inicio

Comp. e Inf. - TEC

Repetir desde i = 1, hasta TAM, i mas 1

Temp=list[i] J=i-1

Repetir si (lista[j] > temp) y (j >= 0 )

Lista[j+1]=lista[j] j-lista[j+1]=temp

Fin

Donde: TAM i,j lista temp : : : : Es la cantidad de elementos Contador tipo entero Es el arreglo a ordenar Variable temporal del mismo tipo de lo que se declar lista

for (i=1; i<TAM; i++) { temp = lista[i]; j = i - 1; while ( (lista[j] > temp) && (j >= 0) ) { lista[j+1] = lista[j]; j--; } lista[j+1] = temp; }

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

4. Ordenamiento Rpido (Quicksort) Es uno de los mtodos ms rpidos en lo que concierne a ordenamiento, desarrollada en los aos 1960 1970 por C.A.R. Hoare, el principio con que enmarca este mtodo es por el principio de que es ms fcil ordenar dos listas pequeas que una lista grande (divide y vencers), lo que se hace es dividir la lista en dos listas, una con valores menores o iguales a un valor y la otra con valores mayores al valor en referencia (el valor es a tomar es cualquiera, por lo que se le denomina pivote). Diagrama de flujo
inicio

Izq=inf Der=sup Mitad=redondear((izq+der)/2) Hacer si Izq<=der


Hacer si (p[izq]<mitad) y (izq<sup)

10

Izq++

Hacer si (mitad<p[der]) y (der>inf)

Der--

Izq<=d aux=p[izq] p[izq]=p[der] p[der]=aux izq++ der--

inf<der

Asignar P,inf,der

inf<sup

Asignar P,izq,sup

Fin

Mtodos de Ordenamiento y Bsqueda Donde: TAM : Izq,der: Inf,sup: p : aux : qs :

Comp. e Inf. - TEC

Es la cantidad de elementos valores que estn a los costados valor superior e inferior Es el arreglo a ordenar Variable temporal del mismo tipo de lo que se declar lista funcin de ordenamiento

Pseudocodigo

void qs(int p[], int inf, int sup) { register izq, der; int mitad, x, aux; izq=inf; der=sup; mitad=p[(izq+der)/2]; do{ while(p[izq]<mitad && izq<sup) while(mitad<p[der] && der>inf) if(izq<=der) { aux=p[izq]; p[izq]=p[der]; p[der]=aux; izq++; der--; } } while(izq<=der); if(inf<der) qs(p,inf,der); if(inf<sup) qs(p,izq,sup); }

11

izq++; der--;

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

METODOS DE BUSQUEDA

BUSQUEDA SECUENCIAL O LINEAL Este mtodo de bsqueda es el ms sencillo y el ms lento, no necesita que el arreglo este ordenado, se desarrolla realizando comparaciones sucesivas con cada uno de los elementos del arreglo, hasta que se encuentre el registro que estamos buscando. Diagrama de Flujo
inicio

12

ingrese el dato a buscar en DATO

iRepetir desde i = 1, hasta TAM, i mas 1

si lista[i]=DATO

El dato que busca no se encuentra en el arreglo

El Dato que busca se encuentra en la posicion i

Fin

Mtodos de Ordenamiento y Bsqueda Donde: TAM i lista Dato : : : :

Comp. e Inf. - TEC

Es la cantidad de elementos Contador tipo entero Es el arreglo a ordenar Variable que se necesita encontrar en la lista.

Pseudocodigo:

For(i=0;i<TAM-1;i++) { If(lista[i]=dato) {Cout<< el dato que busca se encuentra en la posicin << i; salir(); } Cout<< el dato que busca no se encuentra en el arreglo; }

13

BUSQUEDA BINARIA Este mtodo de bsqueda es aplicable solo en arreglos ordenados, este mtodo es sencillo, lo que se hace es seleccionar la posicin central del arreglo y comparar el contenido en esta posicin con el valor que estamos buscando, si es menor entonces escogemos la mitad de la izquierda, caso contrario escogemos la mitad que esta hacia la derecha, encontramos un nuevo intervalo de clculo en este caso tomamos la posicin central del bloque de la derecha y/o izquierda, volvemos a comparar con el valor que estamos buscando y si es menor o mayor escogeremos el de la derecha o izquierda, hasta encontrar el valor que estamos buscando.

Mtodos de Ordenamiento y Bsqueda Diagrama de flujo:

Comp. e Inf. - TEC

inicio A (inf>=sup) y (p[inf] !=

Mitad=(inf=sup)/2 el dato que busca no se encuentra en el arreglo P[mitad] == el dato que busca se encuentra en la posicin mitad

14

aux > Asignar P,aux,inf,mitad-1 Asignar P,aux,mitad+1,sup

Fin

DONDE: TAM : Es la cantidad de elementos Izq,der: valores que estn a los costados Inf,sup: valor superior e inferior p : Es el arreglo a ordenar aux : Variable temporal del mismo tipo de lo que se declar lista busqueda_bin: funcin de bsqueda binaria. Pseudocodigo:

Mtodos de Ordenamiento y Bsqueda

Comp. e Inf. - TEC

int busqueda_bin(int p[],int aux,int inf,int sup) { int mitad; if ((inf>=sup) && 9p[inf] != aux) { cout<< no existe el dato en la tabla; exit; } mitad=(inf+sup)/2; if(p[mitad] == aux) { cout<< el dato se encuentra en la posicin : <<mitad; exit; } else if (aux>p[mitad]) busqueda_bin(p,aux,mitad+1,sup); else busqueda_bin(p,aux,inf,mitad-1); }
EJEMPLO: El siguiente programa es una aplicacin de todos los procedimientos que se ha analizado tanto de ordenamiento como de bsqueda:

15

include <iostream.h> #include<conio.h> #include <stdlib.h> #define m 100

// llamamos a la libreria iostream.h // llamamos a la libreria conio.h

void qs(int p[ ],int inf,int sup); int BusquedaBinaria(int p[ ], int aux,int inf, int sup); main() { int i,j,temp,n,pos_men; float med;

// definicion de variables locales tipo entero // definicion de variable local tipo flotante

Mtodos de Ordenamiento y Bsqueda int lista[m]; int tam; int k; int op;

Comp. e Inf. - TEC

// define una variable local tipo array entero // define la cantidad de elementos // define la variable contador // define variable tipo entero

do {clrscr(); gotoxy(38,10);cout<<"MENU"; gotoxy(28,11);cout<<"=================================================="; gotoxy(28,12);cout<<"1.- GENERAR NUMEROS ALEATORIOS PARA EL ARREGLO"; gotoxy(28,13);cout<<"2.- INGRESAR NUMEROS PARA EL ARREGLO"; gotoxy(28,14);cout<<"3.- ORDENAR POR METODO BURBUJA"; gotoxy(28,15);cout<<"4.- ORDENAR POR EL METODO SELECCION"; gotoxy(28,16);cout<<"5.- ORDENAR POR EL METODO INSERCION"; gotoxy(28,17);cout<<"6.- ORDENAR POR EL METODO RAPIDO"; gotoxy(28,18);cout<<"7.- BUSQUEDA SECUENCIAL"; gotoxy(28,19);cout<<"8.- BUSQUEDA BINARIA"; gotoxy(28,20);cout<<"9.- REPORTE DE LA LISTA"; gotoxy(28,21);cout<<"0.- SALIR"; gotoxy(28,22);cout<<"=================================================="; gotoxy(28,24);cout<<"=================================================="; gotoxy(28,23);cout<<"INGRESE UN NUMERO DEL 0 AL 8 PARA EJECUTAR : "; cin>>op; switch(op) { /**********************************/ /* GENERA CIEN NUMEROS ALEATORIOS */ /**********************************/ case 1 : randomize(); clrscr(); cout<<"<< PRESIONE UNA TECLA PARA GENERAR NUMEROS ALEATORIOS >>\n"; getch(); cout<<"Generando numeros aleatorios \n"; for (k=0;k<100;k++) { lista[k]=random(100); cout<<lista[k]<<" "; } cout<<"\n\n 100 numeros generados \n << presione una tecla para continuar>> ";

16

Mtodos de Ordenamiento y Bsqueda getch(); tam=100; break;

Comp. e Inf. - TEC

/**********************************/ /* INGRESA NUMEROS AL ARREGLO */ /**********************************/ case 2 : clrscr(); cout << "Cuantos numeros desea ingresar (Max 100 Numeros) ? : "; cin >> tam; for (k=0;k<tam;k++) { cout << "ingrese el elemento nro "<<k+1<<" : "; cin>>lista[k]; } cout<<"\n\n a ingresado "<<tam <<" numeros \n\n << presione una tecla para continuar>> "; getch(); break; /**********************************/ /* ORDENA POR EL METODO BURBUJA */ /**********************************/ case 3 : clrscr(); cout<<"<< PRESIONE UNA TECLA PARA ORDENAR POR EL METODO BURBUJA >>\n"; getch(); cout<<"Ordenando \n"; for (i=1; i<tam; i++) for (j=0 ; j<tam - 1; j++) if (lista[j] > lista[j+1]) { temp = lista[j]; lista[j] = lista[j+1]; lista[j+1] = temp; cout<<"."; } cout<<"\n Lista Ordenada ..."; cout<<"\n <<Presione una tecla para continuar>> "; getch();

17

Mtodos de Ordenamiento y Bsqueda break;

Comp. e Inf. - TEC

/**********************************/ /* ORDENA POR EL METODO SELECCION */ /**********************************/ case 4 : clrscr(); cout<<"<< PRESIONE UNA TECLA PARA ORDENAR POR EL METODO SELECCION >>\n"; getch(); cout<<"Ordenando \n"; pos_men=0; for (i=0; i<tam - 1; i++) {for (j=i;j<tam;j++) if (lista[pos_men]>lista[j]) { pos_men =j; temp = lista[i]; cout<<"."; } lista[i] = lista [pos_men]; lista [pos_men] = temp; pos_men=i+1; } cout<<"\n Lista Ordenada ..."; cout<<"\n <<Presione una tecla para continuar>> "; getch(); break; /**********************************/ /* ORDENA POR EL METODO INSERCION */ /**********************************/ case 5 : clrscr(); cout<<"<< PRESIONE UNA TECLA PARA ORDENAR POR EL METODO INSERCION >>\n"; getch(); cout<<"Ordenando \n"; for (i=1; i<tam; i++) { temp = lista[i]; j = i - 1;

18

Mtodos de Ordenamiento y Bsqueda while ( (lista[j] > temp) && (j >= 0) ) { lista[j+1] = lista[j]; j--; cout<<"."; } lista[j+1] = temp; } cout<<"\n Lista Ordenada ..."; cout<<"\n <<Presione una tecla para continuar>> "; getch(); break; /**********************************/ /* ORDENA POR EL METODO RAPIDO */ /**********************************/

Comp. e Inf. - TEC

19

case 6: clrscr(); cout<<"<< PRESIONE UNA TECLA PARA ORDENAR POR EL METODO RAPIDO >>\n"; getch(); cout<<"Ordenando \n"; qs(lista,0,tam-1); cout<<"\n Lista Ordenada ..."; cout<<"\n <<Presione una tecla para continuar>> "; getch(); break; /**********************************/ /* BUSQUEDA SECUENCIA /**********************************/

*/

case 7: clrscr(); j=-1;i=-1; cout<<"<< BUSQUEDA SECUENCIAL >>\n"; cout<<"Ingrese el Numero a buscar : "; cin>>temp; do { i++; cout<<"."; if (lista[i]==temp)

Mtodos de Ordenamiento y Bsqueda j=i;

Comp. e Inf. - TEC

} while ((i<tam) && (lista[i]!=temp)); if (j==-1) cout<<"<< NUMERO INGRESADO NO EXISTE EN LA TABLA >>\n"; else {cout <<"<< NUMERO INGRESADO SI EXISTE EN LA TABLA >>\n"; cout<< "Esta en la posicion "<<j+1; } getch(); break; /**********************************/ /* BUSQUEDA BINARIA /**********************************/

*/

20

case 8: clrscr(); cout<<"<< BUSQUEDA BINARIA >>\n"; cout<<"Ingrese el Numero a buscar : "; cin>>temp; j=-1; j=BusquedaBinaria(lista,temp,0,tam); if(j==-1) cout<<"<< NUMERO INGRESADO NO EXISTE EN LA TABLA >>\n"; else {cout <<"\n<< NUMERO INGRESADO SI EXISTE EN LA TABLA >>\n"; cout<< "Esta en la posicion "<<j+1; } getch(); break; /**********************************/ /* REPORTE DE TODA LA MATRIZ /**********************************/

*/

case 9 : clrscr(); cout<<"<< PRESIONE UNA TECLA PARA REPORTAR >>\n"; getch(); for (i=0; i<tam; i++) cout<<lista[i]<<" ";

Mtodos de Ordenamiento y Bsqueda cout<<"\n <<Presione una tecla para continuar>> "; getch(); break; } } while(op!=0); }

Comp. e Inf. - TEC

/**********************************/ /* ORDENA POR EL METODO RAPIDO */ /**********************************/ void qs(int p[], int inf, int sup) { register izq, der; int mitad, x, aux; izq=inf; der=sup; mitad=p[(izq+der)/2]; do{ while(p[izq]<mitad && izq<sup) izq++; while(mitad<p[der] && der>inf) der--; if(izq<=der) { aux=p[izq]; p[izq]=p[der]; p[der]=aux; izq++; der--; } cout<<"."; } while(izq<=der); if(inf<der) qs(p,inf,der); if(inf<sup) qs(p,izq,sup); } /**********************************/

21

Mtodos de Ordenamiento y Bsqueda /* BUSQUEDA BINARIA /**********************************/ */

Comp. e Inf. - TEC

int BusquedaBinaria(int p[], int aux,int inf, int sup) { int mitad; if((inf>=sup) && (p[inf])!=aux) return -1; mitad=(inf+sup)/2; cout<<"."; if(p[mitad]==aux) return mitad; else if(aux>p[mitad]) BusquedaBinaria(p, aux, mitad+1, sup); else BusquedaBinaria(p, aux, inf, mitad-1); }

22