Está en la página 1de 8

P ROGRAMACIN Y A LGORITMOS

A LGORITMOS DE O RDENACIN Y DE B SQUEDA


1.

Algoritmos de Ordenacin

Para poder ordenar una cantidad determinada de datos existen distintos mtodos (algoritmos) con distintas
caractersticas y complejidad. De cada mtodo, es posible encontrar distintas implementaciones, propuestas,
mejoras, etc.
Estos mtodos sirven para ordenar una lista de elementos, en los ejemplos, los elementos se encuentran
almacenados en arrays unidimensionales (vectores). Los elementos pueden ser de cualquier tipo (siempre que
sean comparables y que las relaciones < y > tengan sentido). Adems, cada uno puede ser utilizado para
ordenar los elementos de menor a mayor o de mayor a menor, cambiando en cada caso la forma de comparar.
Existen mtodos iterativos y mtodos recursivos. Los mtodos iterativos son simples de entender y de
programar ya que son iterativos: simples ciclos y sentencias que hacen que el vector pueda ser ordenado.
Dentro de los algoritmos iterativos encontramos:
Bubble Sort o mtodo de la Burbuja.
Insertion Sort o mtodo de Insercin.
Selection Sort o mtodo de Seleccin.
Shellsort.
A su vez, veremos el algoritmo recursivo Quicksort, el cual es un algoritmo rpido, elegante y corto de
codificar.

1.1.

Bubble Sort o Mtodo de la Burbuja

El mtodo Bubble Sort es uno de los ms simples: compara todos los elementos de una lista contra todos, si se
cumple que uno es mayor o menor a otro, entonces los intercambia de posicin.
Por ejemplo, imaginemos que tenemos los siguientes valores y se los desea ordenar de menor a mayor:
56103
El mtodo de la burbuja comienza recorriendo los valores de izquierda a derecha, comenzando por la posicin
0 (valor 5). Lo compara con el resto de las posiciones a su derecha: con el 6, con el 1, con el 0 y con el
3, cuando encuentra uno menor, los intercambia de posicin. Luego continua con el siguiente (posicin 2),
comparando con todos los elementos de la lista a su derecha (los anteriores ya han sido ordenados, por lo que
compararlos no tiene sentido), esperando ver si se cumple o no la misma condicin que con el primer elemento.
Asi, sucesivamente, hasta el ltimo elemento de la lista.

UNRN - I NGENIERA E LECTRNICA - P ROF. M NICA D ENHAM

1 de 8

P ROGRAMACIN Y A LGORITMOS

Algorithm 1: BubbleSort.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

#define SIZE 100


int swap(int *x, int *y)
{
int aux = *x;
*x = *y;
*y = aux;
return(0);
}
int BubbleSort()
{
int vector[SIZE], i, j, aux;
// inicializacion del vector
for(i=0; i <SIZE; i++) {
for(j=i+1; j <SIZE; j++) {
if (vector[j] <vector[i]) {
swap(&vector[i], &vector[j]);
}
}
}
return 0;
}

1.2.

Ordenacin por insercin

La iteracin principal de la ordenacin por insercin examina sucesivamente todos los elementos de la lista,
desde el segundo hasta el ltimo, e inserta cada uno en el lugar adecuado entre sus predecesores dentro del
vector. Antes de insertar cada elemento donde va, realiza un corrimiento hacia la derecha (para dejar libre la
posicin del vector donde se insertar el elemento).
Algorithm 2: InsertionSort.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#define SIZE 100


int InsertionSort()
{
int vector[SIZE], i, j, aux;
// inicializacion del vector
for(i=0; i <SIZE; i++) {
aux = vector[i];
j = i - 1;
while (vector[j] >aux) && (j >= 0) {
vector[j+1] = vector[j]);
j;
}
vector[j+1] = aux;
}
return 0;
}

UNRN - I NGENIERA E LECTRNICA - P ROF. M NICA D ENHAM

2 de 8

P ROGRAMACIN Y A LGORITMOS

Entonces, si el vector tiene N elementos (con ndices de 0..N-1), el algoritmo consiste en recorrer todo el
vector comenzando desde la segunda posicin (i=1) y terminando en i=N-1. Para cada i, se trata de ubicar en
el lugar correcto el elemento vector[i] en entre los elementos anteriores: vector[i-1], vector[i-2], ..., vector[0].
Dada la posicin actual i, el algoritmo se basa en que los elementos vector[0], vector[1], ..., vector[-1] ya estn
ordenados.

1.3.

Ordenacin por Seleccin

La ordenacin por seleccin selecciona el menor elemento del vector y lo lleva al principio, a continuacin
selecciona el siguiente menor y lo pone en la segunda posicin del vector y asi sucesivamente.
Si el tamao del vector es N, lo que hace el algoritmo es: para cada i de [0..N-2] intercambia vector[i] con el
mnimo elemento del subarray [vector[i+1], ..., vector[N]].
Algorithm 3: SelectionSort.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

#define SIZE 100


int swap(int *x, int *y);
int SelectionSort()
{
int vector[SIZE], i, j, k, p, aux, limite = SIZE-1;
// inicializacion del vector
for(k=0; k <limite; k++) {
p = k;
for (i = k + 1; i <= limite; i++) {
if (vector[i] <vector[p]) {
p = i;
}
if (p != k)
swap (&vector[p], &vector[k]);
}
return 0;
}

1.4.

ShellSort

Este mtodo es una mejora del algoritmo de ordenamiento por Insercin: el ordenamiento por Insercin es
mucho ms eficiente si nuestra lista de nmeros est semi-ordenada y que desplaza un valor una nica posicin
a la vez.
Durante la ejecucin de este algoritmo, los nmeros de la lista se van casi-ordenando y finalmente, el ltimo
paso o funcin de este algoritmo es un simple mtodo por insercin que, al estar casi-ordenados los nmeros,
es ms eficiente.

UNRN - I NGENIERA E LECTRNICA - P ROF. M NICA D ENHAM

3 de 8

P ROGRAMACIN Y A LGORITMOS

Algorithm 4: ShellSort.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#define SIZE 100


int swap(int *x, int *y);
int ShellSort()
{
int vector[SIZE], i, j,aux, incr = SIZE;
// inicializacion del vector
do {
for (i = incr; i <SIZE; i++) {
for (j = i; (j>=incr) && (vector[j-incr]>vector[j]); j -= incr) {
swap(&vector[j], &vector[j-incr]);
}
}
incr = incr / 2;
}while (incr >0)
return 0;
}

1.5.

QuickSort - Ordenacin rpida [1]

Se basa en la divisin en particiones de la lista a ordenar, aplica la tcnica divide y vencers. El mtodo
es, posiblemente, el ms pequeo en cdigo, ms rpido, ms elegante y ms interesante y eficiente de los
algoritmos conocidos de ordenacin.
El mtodo se basa en dividir los n elementos de la lista a ordenar en dos partes separadas por un elemento:
una particin izquierda, un elemento central llamado pivote y una particin derecha: la particin o divisin se
hace de tal forma que todos los elementos de la particin o sublista izquierda son menores al pivote y todos los
elementos de la particin o sublista derecha son mayores al pivote. Luego las dos sublistas se ordenan de forma
independiente (y concurrente).
Primero se elige un pivote, y luego se utiliza dicho pivote para ordenar el resto de la lista en dos sublistas:
una tiene todas las claves menores y la otra todas las claves mayores o iguales al pivote (o al revs). Estas
dos sublistas se ordenan de forma recursiva utilizando el mismo algoritmo. La lista final ordenada se consigue
concatenando la primera sublista, el pivote y la segunda sublista.
1.5.1.

Algoritmo Quicksort

La primera etapa del algoritmo consiste en elegir el pivote, y luego se ha de buscar la forma de situar en
la sublista izquierda todos los elementos menores que el pivote y en la sublista derecha todos los elementos
mayores que el pivote.
Los pasos del algoritmo son:
Seleccionar el elemento central de a[0..n-1] como pivote.
Dividir los elementos restantes en particiones izquierda y derecha, de modo que ningn elemento de la
izquierda tenga una clave mayor que el pivote y ninguno de la derecha tenga una clave menor al pivote.
Ordenar la sublista izquierda usando quicksort recursivamente.
Ordenar la sublista derecha usando quicksort recursivamente.
La solucin es particin izquierda seguida del pivote y a continuacin particin derecha.
UNRN - I NGENIERA E LECTRNICA - P ROF. M NICA D ENHAM

4 de 8

P ROGRAMACIN Y A LGORITMOS

1.5.2.

Ejemplo

Se ordena una lsita de nmeros enteros aplicando el algoritmo quicksort. Como pivote se elige el elemento
central de la lista.
Lista original: 8 1 4 9 6 3 5 2 7 0
pivote (elemento central): 6
La etapa 2 requiere mover los elementos mayores a la derecha y los menores a la izquierda. Para ello se
recorre la lista de izquierda a derecha utilizando un ndice i, que se inicializa en la posicin ms baja, buscando
un elemento mayor al pivote. Tambin se recorre la lista de derecha a izquierda buscando un elemento menor.
Para hacer esto se utilizar un ndice j inicializado a la posicin ms alta.
8

Ahora se intercambian 8 y 0 para que estos dos elementos se siten correctamente en cada sublista y se
incrementa el ndice i, y se decrementa j para seguir los intercambios.
8

A medida que el algoritmo contina, i se detiene en el elemento mayor, 9, y j se detiene en el elemento


menor, 2.
0

Se intercambian los elementos mientras i y j no se crucen. En el momento en que se cruzan los ndices se
detiene este bucle. En el caso anterior se intercambian 9 y 2.
0

Contina la exploracin y ahora el contador i se detiene en el elemento 6 (que es el pivote) y el ndice j se


detiene en el elemento menor 5. Se intercambian 6 y 5, se incrementa i y se decrementa j.
0

i=j

Los ndices tienen actualmente los valores i = 5, j = 5. Continua la exploracin hasta que i >j, acaba con i =
6, j = 5.
0

UNRN - I NGENIERA E LECTRNICA - P ROF. M NICA D ENHAM

5 de 8

P ROGRAMACIN Y A LGORITMOS

En esta posicion los ndices i y j han cruzado posiciones en el arreglo. En este caso se detiene la bsqueda
y no se realiza ningn intercambio ya que el elemento al que accede j est ya correctamente situado. Las dos
sublistas ya han sido creadas, la lista original se ha dividido en dos particiones:

sublista izquierda
0 1 4 2 5

1.6.

pivote
6

sublista derecha
9 7 8

Codificacin del algoritmo

A continuacin se codifica la funicn recursiva quicksort(); a esta funcin se la llama pasando como
argumentos el arreglo a[] y los ndice que la delimitan 0 y n-1 (ndices inferior y superior). Llamada a la
funcin: quicksort(n, 0, n-1) y la codificacin de la funcin:
Algorithm 5: Quicksort.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

2.

#define n
void quicksort(double a[], int primero, int ultimo)
{
int i, j, central;
double pivote;
central = (primero + ultimo) / 2;
pivote = a[central];
i = primero;
j = ultimo;
do {
while (a[i] <pivote) i++;
while (a[j] >pivote) j;
if (i <= j) {
double tmp;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
i++;
j;
}
}while (i <= j)
if (primero <j)
quicksort(a, primero, j);
/* llamada recursiva con sublista izquierda */
if (i <ultimo)
quicksort(a, i, ultimo);
/* llamada recursiva con sublista derecha */
}

Bsquedas

Con mucha frecuencia se trabaja con grandes volmenes de datos, y muchas veces es necesario determinar
si un dato se encuentra en un conjunto de datos. Especficamente el proceso de encontrar un elemento especfico

UNRN - I NGENIERA E LECTRNICA - P ROF. M NICA D ENHAM

6 de 8

P ROGRAMACIN Y A LGORITMOS

en un arreglo, lista, etc, se denomina bsqueda. Las tcnicas de bsqueda ms utilizadas son: bqueda lineal o
secuencial, la tcnica ms sencilla, y bsqueda binaria o dicotmica, la tcnica ms eficiente.

2.1.

Bsqueda Secuencial [1]

Este algoritmo busca un elemento dado, recorriendo secuencialmente el arreglo desde un elemento al siguiente desde la primer posicin y se detiene cuando se encuentra el elemento o bien cuando se alcanza el final
del arreglo.
Este algoritmo buscar desde el primer elemento, el segundo, y as sucesivamente hasta encontrar el elemento o llegar al final del arreglo. Se utiliza un while para su implementacin:
Algorithm 6: Bsqueda secuencial
1
2
3
4
5
6
7
8
9
10
11
12
13

#define n
int BusquedaSec(int lista[MAX], int elemento)
{
int encontrado = 0;
int i = 0;
while ((!encontrado) && (i <= MAX -1)) {
encontrado = (lista[i] == elemento) ? 1 : i++;
}
if (encontrado)
return 1;
else
return -1;
}

Esta bsqueda se aplica a cualquier lista: no hace falta que los datos estn ordenados. En caso de que los
datos estn ordenados, analizar cmo se puede mejorar el algoritmo.

2.2.

Bsqueda Binaria o Dicotmica [1]

Si la lista est ordendada, la bsqueda dicotmica proporciona una tcnica de bsqueda mejorada.
La bsqueda dicotmica es similar a la bsqueda de una palabra en un diccionario: uno puede abrir el
diccionario por la mitad, y verificar si la letra de la pgina abierta es mayor o menor a la letra inicial de la
palabra buscada. Si es mayor, se descarta la mitad mayor y se utilizan las pginas con letras menores para
continuar con el mismo proceso. Al contrario, se continua el proceso con la segunda mitad en que fue dividido
el diccionario. El proceso implementado por la bsqueda binaria es similar, y se fundamenta en que los datos
de la lista estn ordenados.
Suponiendo que la lista est almacenada en el arreglo a[], los ndices de la lista son inf = 0 y sup = n - 1
donde n es la cantidad de elementos del arreglo. Los pasos a seguir son:
1. Calular el ndice del punto central del arreglo: central = (inf + sup) / 2 (divisin entera)
2. Comparar el valor de este elemento central con la clave:
- Si a[central] < clave, la nueva sublista de bsqueda est en el rango
central + 1 .. sup
- Si clave < a[central], la nueva sublista de bsqueda ser:
inf .. central - 1
Algoritmo de la bsqueda binara: devuelve el ndice del alemento buscado, o bien -1 en caso de que el
elemento no est en la lista.
UNRN - I NGENIERA E LECTRNICA - P ROF. M NICA D ENHAM

7 de 8

P ROGRAMACIN Y A LGORITMOS

Algorithm 7: Bsqueda Binaria


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

int BusquedaBin(int lista[], int n, int clave)


{
int central, bajo, alto;
int valorCentral;
int bajo = 0;
int alto = n-1;
while (bajo <= alto) {
central = (bajo + alto) / 2;
valorCentral = lista[central];
if (clave == valorCentral)
return central;
else if (clave <valorCentral)
alto = central-1;
else
bajo = central +1;
}
return -1;
}

Referencias
[1] Luis Joyanes Aguilar, Ignacio Zahonero Martnez. Programacin en C, C++, JAVA y UML. McGrawHill.
2010.

UNRN - I NGENIERA E LECTRNICA - P ROF. M NICA D ENHAM

8 de 8

También podría gustarte