You are on page 1of 44

Sesin 8

Ordenamiento y Bsqueda
Ms. Ing. CARLOS AURELIO ROMERO SHOLLANDE caromerosh@yahoo.es
UNIVERSIDAD NACIONAL DE TRUJILLO Trujillo - Per

Introduccin
Con frecuencia el programador trabajar con grandes cantidades de informacin almacenada en arreglos. Muchas veces, se requiere ordenar dicha informacin y buscar s un valor especificado esta contenido en algn arreglo.

El ordenamiento, la bsqueda y la mezcla de datos son problemas que estudiaremos en la presente sesin.

Ordenamiento
El ordenamiento de datos (sort en ingls) consiste en colocar los datos en algn orden particular (por ejemplo; ascendente o descendente).

Es una de las tareas que consume ms tiempo; por este motivo, se han desarrollado cientos de mtodos diferentes para la ordenacin de datos, y es imposible determinar cul es el mejor en todas las circunstancias.

Mtodos de Ordenamiento
Los mtodos ms usados son:
Mtodo de la burbuja, es el mtodo ms comn, pero tiene pocas caractersticas positivas y es mejor no utilizarlo. Mtodo de seleccin Mtodo de insercin, son tiles para arreglos pequeos. Mtodo de Shell, es el mtodo que ms se utiliza, incluso para arreglos con miles de entradas.

Ordenamiento por Burbuja


A este mtodo tambin se le conoce como Ordenamiento por Hundimiento. Los valores ms pequeos gradualmente burbujean hacia la parte alta del arreglo, como las burbujas de aire que ascienden en el agua, mientras que los valores ms grandes se hunden al fondo del arreglo. La tcnica consiste en pasar varias veces por el arreglo. En cada paso, se comparan pares sucesivos de elementos. Por ejemplo, si se desea ordenar los valores del arreglo: X[i] = [6 8 5 3] en orden ascendente, existen dos procedimientos:

Ordenamiento por Burbuja


Mtodo 1 1) Se definen dos subndices (i y j), el primero para definir el nmero de pase por el arreglo y el segundo para las comparaciones. 2) Aunque hay (n=4) elementos en el arreglo, solo se efectan (n-1=3) comparaciones en cada pase. As mismo, slo se necesitan (n-1=3) pases por el arreglo, por lo tanto los rangos de cada subndice son: i : 1 .. n-1 j : 1 .. n-1 Por lo tanto, los bucles a utilizar son los siguientes: Para i=1 Hasta n-1 Variacin 1 Para j=1 Hasta n-1 Variacin 1

Ordenamiento por Burbuja


3) Se realiza una comparacin entre ambos elementos del par sucesivo de elementos. Si X[j]>X[j+1] Entonces Primero se compara X[1] con X[2], luego X[2] con X[3] y X[3] con X[4]. Si uno de los pares est en orden descendente, se intercambian sus valores en el arreglo. Si el par est en orden ascendente (o son idnticos los valores), se quedan tal como estn.

Ordenamiento por Burbuja


4) En el caso de que se requiera de un intercambio y con la finalidad de garantizar la conservacin de los valores del arreglo, se utiliza una variable auxiliar (t) sobre la cual se copiara el valor del primer elementos del par (X[j]). Por ejemplo:
X[j] X[2] 8

X[j+1] Variable auxiliar

X[3] t

Es decir: t = X[j] Enseguida se hace una copia del valor del segundo elemento del par (X[j+1]) sobre el primer elemento (X[j]):

Ordenamiento por Burbuja


X[j] X[j+1] X[2] X[3] 8 5

Variable auxiliar

Es decir: X[j] = X[j+1] Luego se hace una copia del valor de la variable auxiliar (t) sobre el segundo elemento (X[j+1]):
X[j] X[j+1] Variable auxiliar X[2] X[3] t 5 5 8

Es decir: X[j+1] = t

Ordenamiento por Burbuja


Finalmente, los elementos quedarn ordenados de la siguiente manera:
X[j] X[j+1] Variable auxiliar X[2] X[3] t 5 8 8

Un valor grande puede moverse hacia abajo del arreglo muchas posiciones con un solo pase, pero un valor pequeo se mover hacia arriba una sola posicin. En el primer pase, se garantiza que el mayor valor se hunde hasta el fondo del arreglo. En el segundo pase se garantiza que el segundo valor mayor se hunde hasta la penltima posicin y as sucesivamente.

Ordenamiento por Burbuja


Mtodo 2 1) Este mtodo consiste en comparar todos los elementos del arreglo en pares de elementos, para ello se definen dos subndices, i para definir al primer elemento del par y j para el segundo elemento. 2) Se determina el rango de cada subndice, teniendo en cuenta que para realizar las comparaciones, el primer elemento del par X[i], comenzar en la posicin 1 y el segundo se iniciar en una posicin ms adelante que el primero X[j]=X[i+1]. El primero terminar en una posicin menor que el ltimo X[n-1] y el segundo en la ltima posicin X[n]. En el ejemplo las comparaciones seran:

Ordenamiento por Burbuja


Primer elemento del par i Valor inicial (i=1) 1 1 1 Valor inicial (i=2) 2 2 Valor inicial (i=3) 3 j 2 3 4 3 4 4 Segundo elemento del par Valor inicial (j=i+1=2) Valor final (j=n=4) Valor inicial (j=i+1=3) Valor final (j=n=4) Valor final (j=n=4)

Por lo tanto, los rangos de cada subndice estarn definidos por: i: 1 .. n-1 j: i+1 .. n

Ordenamiento por Burbuja


Luego, los bucles a utilizar son los siguientes: Para i=1 Hasta n-1 Variacin 1 Para j=i+1 Hasta n Variacin 1 3) Se realiza la comparacin entre los elementos de cada par, mediante la siguiente condicin: Si X[i]>X[j] Entonces En la primera iteracin del bucle i se compara X[1] con X[2], luego con X[3] y finalmente con X[4]. Si uno de los pares est en orden descendente, se intercambian sus valores en el arreglo. Si el par est en orden ascendente (o son idnticos los valores), se quedan tal como estn.

Ordenamiento por Burbuja


4) En el caso de que se requiera de un intercambio y con la finalidad de garantizar la conservacin de los valores del arreglo, se utiliza un procedimiento similar al del mtodo 1 de ordenamiento por burbuja. Por ejemplo, la comparacin del segundo elemento con el tercero: Primero se copia el valor del primer elemento del par X[i] sobre la variable auxiliar (t):
X[i] X[j] Variable auxiliar X[2] X[3] t 8 5

Es decir: t = X[i]

Ordenamiento por Burbuja


Luego se copia el valor del segundo elemento del par X[j] sobre el primer elemento X[i]:
X[i] X[j] Variable auxiliar X[2] X[3] t 8 5 8

Es decir: X[i] = X[j] Finalmente, se copia el valor de la variable auxiliar (t) sobre el segundo elemento X[j]:
X[i] X[j] Variable auxiliar X[2] X[3] t 5 5 8

Ordenamiento por Burbuja


Es decir: X[j] = t Los elementos quedarn ordenados de la siguiente manera:
X[i] X[j] X[2] X[3] 5 8

Variable auxiliar

5) Estos pasos se repiten hasta tener todos los elementos ordenados.

Ordenamiento por Seleccin


Este mtodo consiste en seleccionar el menor elemento del arreglo y colocarlo en la primera ubicacin mediante el intercambio de valores. Entre los elementos restantes nuevamente se busca el menor y lo colocamos en la segunda ubicacin, mediante el intercambio de valores, y as sucesivamente, hasta tener todos los elementos ordenados. La tcnica consiste en lo siguiente: 1) Se definen dos subndices (i y j), el primero para definir el nmero de bsqueda por el arreglo y el segundo el nmero de comparacin para encontrar el menor elemento.

Ordenamiento por Seleccin


2) Se determina el rango de cada subndice, teniendo en cuenta que, aunque hay (n=4) elementos en el arreglo, solamente se necesitan (n-1=3) bsquedas. As mismo, teniendo en cuenta que el menor elemento de la bsqueda i siempre comenzar a compararse con el siguiente elemento del arreglo (j=i+1) y terminar con el ltimo (n); entonces, el nmero de comparaciones en cada bsqueda es (n-i). Por lo tanto, los rangos de cada subndice son: i : 1 .. n-1 j : i+1 .. N Luego, los bucles a utilizar son los siguientes: Para i=1 Hasta n-1 Variacin 1 Para j=i+1 Hasta n Variacin 1

Ordenamiento por Seleccin


3) La primera vez que se ejecuta el bucle i (es decir i=1) se hace lo siguiente: k=1 [Subndice del menor elemento] menor = X[1] Aqu se supone que el menor elemento del arreglo es el primero (ndice 1). 4) Se inicia el bucle j (j=2), que sirve para buscar el menor elemento de todos, para lo cual se realiza la siguiente comparacin: Si X[2]<menor Entonces

Ordenamiento por Seleccin


5) Al trmino del bucle j, k contiene el subndice del menor elemento y menor contiene el valor del menor elemento, los cuales sern intercambiados a la primera ubicacin no ordenada mediante las siguientes sentencias: X[k] = X[i] X[i] = menor Estos pasos se repiten hasta tener todos los elementos ordenados.

Ordenamiento por Insercin


Esta tcnica tambin se denomina mtodo del jugador de cartas, por su semejanza con la forma de clasificar las cartas de una baraja insertando cada carta en el lugar adecuado. En esta ordenacin, en cada etapa ya se tiene una lista ordenada, pero ms pequea. El algoritmo de ordenacin por insercin ordena los dos primeros elementos de la lista, a continuacin el tercer elemento se inserta en la posicin que corresponde, el cuarto se inserta en la lista de tres elementos, y as sucesivamente. Este proceso contina hasta que la lista este totalmente ordenada. El procedimiento es el siguiente:

Ordenamiento por Insercin


1) Al primer elemento (i=1) no se le modifica su ubicacin, y a los elementos restantes, que se desean insertar, sus ubicaciones variarn desde i=2 hasta n. 2) Para (i=2), este elemento se asigna a una variable auxiliar (t). El dato almacenado en t se compara con el elemento almacenado en X[1]. Si t es menor que X[1], entonces X[1] se transfiere a X[2] y t a X[1]. Si no t se transfiere a X[2].

Ordenamiento por Insercin


3) Comparar X[3] con X[2]. Si X[3] es mayor o igual que X[2] entonces se contina con el siguiente elemento, si no se compara X[3] con X[1]. Si X[3] es mayor o igual que X[1], entonces X[3] se transfiere a t, X[2] a X[3] y t a X[2]. Si X[3] es menor que X[1], entonces se transfiere X[1] a t, X[3] a X[1], X[2] a X[3] y t a X[2]. 4) Repetir los pasos anteriores hasta completar el ordenamiento.

Ordenamiento Shell
Es un mtodo de ordenamiento muy rpido, fue desarrollado por Donald Shell (1959), el procedimiento es sencillo y corto, pero su comprensin no lo es y se basa en una sucesin de clasificaciones. Es una mejora del mtodo de insercin directa basada en la disminucin de los incrementos o saltos. Se comparan los elementos dos a dos: X[i] con X[i+n/2] y se les ordena. Se hacen las mismas comparaciones pero de la forma: X[i] con X[i+n/2] y se les ordena. Luego se hacen las mismas comparaciones pero de la forma: X[i] con X[i+n/4] y tambin se les ordena. Este proceso contina hasta que se obtiene la clasificacin final. El procedimiento es:

Ordenamiento Shell
1) Se selecciona el salto o intervalo en el arreglo original (k=n/2), se forman grupos de dos elementos cada uno (posiciones [j] y [j+k]) y se clasifica cada grupo por separado (compara parejas de elementos, si no estn ordenados se intercambian de posiciones entre s). Se realiza una o ms repasadas en esta operacin hasta comprobar que ya no se requiere intercambios de posiciones.

Ordenamiento Shell
2) Se selecciona un nuevo salto para el arreglo obtenido en el paso anterior (k=k/2), se forman grupos de dos elementos cada uno y se clasifica cada grupo por separado. Se realiza una o ms repasadas hasta comprobar que ya no se requieren intercambios de posiciones. 3) El procedimiento se repite hasta que el salto sea k=1. Completndose el ordenamiento con las repasadas necesarias hasta comprobar que ya no se requieren intercambios de posiciones.

Ejemplo 1
Ingresar el tamao de un vector as como cada uno de sus elementos. Ordenar los elementos del vector en forma ascendente usando el mtodo 1 de la burbuja. Codificacin:
#include <iostream.h> // ORDENAMIENTO POR BURBUJA 1 #include <conio.h> main() { int n; // Nmero de elementos del vector int i; // Contador que al inicio indica elementos no ordenados int j; // Contador que compara e intercambia elementos int t; // Variable auxiliar usada para el intercambio de valores int x[20]; // Elemento del vector clrscr(); cout<<"Tamao del vector"; cin>>n;

Ejemplo 1
cout<<"Elementos del vector"; for(i=1;i<=n;i++) // Ingreso de datos del vector cout<<"Elemento N "<<i<<" : "; cin>>*(x+i); for(i=1;i<=n;i++) { // Ordenamiento del vector for(j=1;j<=n-1;j++) { if(*(x+j)>*(x+(j+1))) { // Intercambio de valores t=*(x+j); *(x+j)=*(x+(j+1)); *(x+(j+1))=t; } } } clrscr(); cout<<"Vector Ordenado\n\n"; for(i=1;i<=n;i++) cout<<*(x+i)<<endl; } getch(); }

Bsqueda
La bsqueda (search en ingls) es un proceso que permite determinar si un arreglo contiene un valor que sea igual a cierto valor clave. Existen dos tcnicas de bsqueda: Bsqueda lineal Bsqueda binaria

Bsqueda Lineal
La bsqueda lineal es la tcnica ms simple y funciona bien con arreglos pequeos y no ordenados. Consiste en comparar la clave de bsqueda con todos los elementos del arreglo. Por ejemplo, buscar el valor clave = 5 en el arreglo: X[i] = [8 3 5 7].
Clave 3 i 1 2 3 n=4 X[i] 8 3 5 7

Bsqueda Lineal
El procedimiento es el siguiente: 1) Inicialmente a la posicin del elemento buscado (p) se le asigna un valor que no corresponde a ningn valor posible del subndice del arreglo, tal como, -1. p = -1 2) Se genera un bucle que permita comparar la clave con cada uno de los elementos del arreglo: Para i=1 Hasta n Variacin 1 Hacer Si clave = X[1] Entonces p = i

Bsqueda Lineal
3) Si el resultado de la comparacin es verdadera para un valor del subndice del arreglo, entonces este valor ser la posicin del elemento buscado; en el ejemplo, p=3. 4) En el caso de que el valor inicial de p no vari, despus de haberse realizado todas las comparaciones, implica que el valor buscado no existe en el arreglo.

Bsqueda Binaria
La bsqueda binaria es la tcnica de ms alta velocidad y funciona eficientemente con arreglos grandes y ordenados previamente. Consiste en eliminar, tras cada comparacin, la mitad de los elementos del arreglo en los que se efecta la bsqueda. Primero localiza el elemento central del arreglo y luego lo compara con la clave de bsqueda. Si son iguales, se ha encontrado dicha clave y se devuelve el subndice de ese elemento. De otro modo, el problema se reduce a buscar en una mitad del arreglo.

Ejemplo 2
Ingresar el tamao de un vector y cada uno de sus elementos. As mismo, ingresar un nmero y en el caso de que ste se encuentre dentro del vector, reportar la posicin que ocupa. En caso contrario, reportar el mensaje: El elemento buscado no ha sido encontrado. Usar el mtodo de bsqueda lineal. Codificacin:
#include <iostream.h> // BUSQUEDA LINEAL #include <conio.h> main() { int n; // Nmero de elementos del vector int i; // Contador de los elementos del vector int clave; // Valor que ser buscado en el arreglo int p; // Posicin del elemento buscado

Ejemplo 2
int x[20]; // Elementos del vector clrscr(); cout<<"Tamao del vector"; cin>>n; cout<<"Elementos del vector"; for(i=1;i<=n;i++) { // Ingreso de elementos del vector cout<<"Elemento N "<<i<<" : "; cin>>*(x+i); } clrscr(); // Introduccin de clave de bsqueda cout<<"Ingrese el nmero a buscar: "; cin>>clave; p=-1; // Ubicacin de la posicin del nmero buscado for(i=1;i<=n;i++) if(*(x+i)==clave) p = i; if(p!=-1) cout<<"Elemento buscado se encuentra en la posicin: "<<p; else cout<<"El elemento buscado no ha sido encontrado"; getch(); }

Mezcla
La mezcla o fusin (merge en ingls) consiste en tomar dos arreglos (X[i] e Y[j]) ordenados previamente y obtener un nuevo arreglo (Z[h]) tambin ordenado a partir de la intercalacin de ambos. El algoritmo ms sencillo para resolver el problema consiste en: Situar todos los elementos de X en el nuevo vector Z. Situar todos los elementos Y en el nuevo vector Z. Ordenar todo el vector Z. Evidentemente esta es una solucin correcta.

Mezcla
Sin embargo se ignora por completo el hecho de que los arreglos X e Y estn clasificados, lo que supondr una ralentizacin (reunin) del proceso en el tiempo. El proceso correcto consiste en lo siguiente: 1) Inicializar los subndices de los tres arreglos X, Y e Z, es decir: i=1, j=1 y h=1 respectivamente. 2) Siempre que los subndices de los dos arreglos iniciales X e Y (es decir, i y j respectivamente), sean menores que sus tamaos (M y N), comparar los elementos respectivos de ambos arreglos y seleccionar el elemento que tiene el menor valor.

Mezcla
1 3 i=4 i=3 i=2 i=1 X[i]<Y[j] j=6 j=5 j=4 j=3 j=2 j=1 2 7 3 4 X[i]

13 17

i>4 No Disponible j>6 No Disponible 5 1 9 2 11 3 19 4 23 5 28 6


Z[h]

Y[j]

h=10 h=9 h=8 h=7 h=6 h=5 h=4 h=3 h=2 h=1

10

Mezcla
3) Ubicar el elemento seleccionado en el paso anterior en el nuevo arreglo Z y el subndice del arreglo seleccionado (i j) incrementar en 1. 4) Incrementar el subndice de arreglo resultante h en 1. 5) Seguir esta secuencia de comparaciones hasta que los elementos de uno de los arreglos se haya agotado, es decir, hasta que el valor del subndice de dicho arreglo sea mayor que su tamao. 6) Copiar el resto de elementos del arreglo no agotado en el arreglo resultante Z, sin olvidar que el subndice del arreglo resultante (h) se deber continuar incrementando en 1; hasta obtener, finalmente, su tamao de M + N elementos.

Problema 3
Ingresa dos vectores, ordenarlos en forma descendente, luego obtener y reportar un nuevo vector formado por la mezcla o fusin (merge) de los dos anteriores, tambin ordenado en forma decreciente. Codificacin:
#include <iostream.h> // MEZCLA DE VECTORES #include <conio.h> #define lim 20 main() { int a, b; // Tamao de lo vectores int i, j; // Subndices de los vectores int h, k; // Subndices auxiliares de los vectores int g; // Subndice del vector mezcla int r, t; // Variables para intercambios en ordenamiento int p; // Subndice para el resto del vector no agotado

Problema 3
int x[lim]; // Elementos del primer vector int y[lim]; // Elementos del segundo vector int z[lim]; // Elementos del vector mezcla do { clrscr(); cout<<"Tamao del primer vector :"; cin>>a; cout<<"Tamao del segundo vector :"; cin>>b; } while(a<=0 && b<=0); clrscr(); cout<<"\n\nINGRESO DE DATOS DE PRIMER VECTOR\n\n"; for(i=1;i<=a;i++) { cout<<i; cin>>*(x+i); } clrscr();

Problema 3
cout<<"\n\nINGRESO DATOS DE SEGUNDO VECTOR\n\n"; for(j=1;j<=b;j++) { cout<<j; cin>>*(y+j); } for(i=1;i<=a-1;i++) { // Ordenamiento del primer vector for(h=i+1;h<=a;h++) { if(*(x+i)>*(x+h)) { r=*(x+i); *(x+i)=*(x+h); *(x+h)=r; } } } for(j=1;j<=b-1;j++) { // Ordenamiento del segundo vector for(k=j+1;k<=b;k++) { if(*(y+j)>*(y+k)) { t = *(y+j); *(y+j) = *(y+k); *(y+k) = t; } } }

Problema 3
i=1; // Valor inicial del subndice del primer vector j=1; // Valor inicial del subndice del segundo vector g=1; // Valor inicial del subndice del vector mezcla while(i<=a && j<=b) { // Mezclar los vectores if(*(x+i)<=*(y+j)) { // Ingreso de elementos de primer vector *(z+g)=*(x+i); i=i+1; } else { // Ingreso de elementos del segundo vector *(z+g)=*(y+j); j=j+1; } g=g+1; // Incremento del subndice del vector mezcla } // Los elementos de algn arreglo pudiera no haberse agotado // Para superar el problema, se copia el resto del vector no agotado

Problema 3
if(i>a) { // Si ndice 1er. vector llega a ser mayor que su tamao for(p=j; p<=b; p++) { *(z+g)=*(y+p); g=g+1; } } else { // Si ndice de 2do. vector llega a ser mayor que su tamao for(p=i; p<=a; p++) { *(z+g)=*(x+p); g=g+1; } } clrscr(); cout<<"\n\nDATOS DEL VECTOR MEZCLADO\n\n"; cout<<"Nmero Dato"; for(g=1;g<=a+b;g++) { // Vector mezcla cout<<g<< <<*(z+g); } getch(); }

You might also like