You are on page 1of 24

ORDENACIN , BSQUEDA E INTERCALACIN

ORDENACIN, BSQUEDA E INTERCALACIN


Los procesos que consumen ms tiempo durante la operacin de un ordenador, son
ordenacin, bsqueda e intercalacin. La ordenacin se clasifica en interna
(matrices), y externa (archivos). Las tcnicas ordenacin, mezcla e intercalacin
deben ser dominadas por el alumno.

ORDENACIN
Es un proceso para clasificar los elementos de un array en un orden particular. Por
ejemplo, clasificar un conjunto de nmeros en orden creciente o una lista de
nombres por orden alfabtico. La clasificacin es una operacin tan frecuente en
programas de computadora que una gran cantidad de algoritmos han sido diseados
para clasificar listas de elementos con eficacia y rapidez. La eleccin de un
determinado algoritmo depende del tamao del vector o array a clasificar, el tipo de
datos y la cantidad de memoria disponible. La ordenacin o clasificacin es el
proceso de organizar datos en algn orden o secuencia especfica tal como
creciente o decreciente para datos numricos o alfabticamente para datos de
caracteres.
Los mtodos de ordenacin se dividen en dos categoras:
Ordenacin interna (vectores, tablas, matrices)
Ordenacin externa (archivos)
La ordenacin de arrays se maneja en la memoria RAM, por lo tanto se hace a gran
velocidad y acceso aleatorio. La ordenacin de archivos se suele hacer sobre
soportes de almacenamiento externo, discos, cintas, etc. Estos dispositivos son ms
lentos en las operaciones de entrada- salida, pero pueden contener mayor cantidad
de
informacin.
Los mtodos de ordenacin que desarrollaremos podrn ser explicados a vectores,
pueden ser ex-tendidos a matrices o tablas, ya que toda ordenacin de tabla o matriz
se basa en la ordenacin de una fila o columna, que no es otra cosa que un vector.
Los ms populares son:
Intercambio
Seleccin
Insercin
MTODO DE INTERCAMBIO O DE BURBUJEO
El algoritmo de clasificacin de intercambio o de la burbuja, debera ser denominado
de decantacin y se basa en el principio de comparar pares de elementos
adyacentes e intercambiarlos entre s hasta que estn todos ordenados.
Partamos que poseemos el siguiente vector y se desea ordenar en forma
ascendente (el menor en la posicin V(1) y el ltimo en V(9)):

V(1) 64
V(2) 28
V(3) 13
V(4) 23
V(5) 79
V(6) 54
V(7) 25
V(8) 18
V(9) 41

Los pasos a dar son:


1. Comparar V(1) y V(2). Si estn en orden, se mantienen como estn; caso
contrario se intercambian entre s.
2. A continuacin se comparan los elementos 2 y 3; de nuevo si no estn en
orden, se intercambian sino no.
3. Y as sucesivamente, hasta que cada elemento del vector ha sido comparado
con sus elementos adyacentes y se han realizado los intercambios
necesarios.
4. N-S
El mtodo se expresa as:
Pseudicdigo desde I = 1 hasta 8 hacer I = 1 hasta 8
si elemento (I) > elemento (I + 1) entonces elemento (I) > elemento (I + 1)
intercambiar elementos (I, I+ 1) intercambiar elementos (I, I+ 1)
fin si
fin desde
Intercambiar es un procedimiento para trocar los valores de dos elementos A(I), A(I +
l), es una accin compuesta que contiene las siguientes acciones:
AUX A(I)
A(I) A(I + 1)
A(I + 1) AUX
El valor ms grande rpidamente baja al ltimo lugar, mientras el ms pequeo sube
posicin a posicin hacia el comienzo de la lista al igual que las burbujas de aire en
una botella de gaseosa. Tras realizar un recorrido completo por todo el vector, el
elemento ms grande habr llegado a ocupar la ltima posicin.
En el segundo recorrido, el segundo elemento llegar a la penltima, y as
sucesivamente.
Ahora veremos como funciona esta idea en el ejemplo anterior.
Nmero de paso:

Inic 1 2 3 4 5 6 7 8
V(1) 64 28 13 13 13 13 13 13 11
V(2) 28 13 23 23 23 23 18 11 13
V(3) 13 23 28 28 25 18 11 18 18
V(4) 23 64 54 25 18 11 23 23 23
V(5) 79 54 25 18 11 25 25 25 25
V(6) 54 25 18 11 28 28 28 28 28
V(7) 25 18 11 54 54 54 54 54 54
V(8) 18 11 64 64 64 64 64 64 64
V(9) 11 79 79 79 79 79 79 79 79
El pseudocdigo de este algoritmo de ordenacin, es el que desarrollamos en los
siguientes pasos
Pseudocdigo algoritmo burbuja1
lNlClO
para I 1 hasta N 1 hacer
para J 1 hasta N 1 hacer
si X(J) > X(J + 1) entonces {intercambiar}
AUX X(J)
X(J) X(J + 1)
X(J+ 1) AUX
fin si
fin para
fin para
El diagrama N-S del algoritmo de burbuja1:
I 1 hasta N 1
J 1 hasta N 1
X(J) > X(J + 1) {intercambiar}
AUX X(J)
X(J) X(J + 1)
X(J+ 1) AUX
Si se efecta n-1 veces la operacin sobre un vector de n valores se tiene ordenada
el vector. Cada operacin requiere n-1 comprobaciones o test y como mximo n-1
intercambios. La ordenacin total exigir un mximo de
(n 1) *(n l) = (n 1)2 intercambios de elementos.
Las sucesivas situaciones de los elementos del vector se ve en el listado anterior.
Si observamos en detalle notamos, que en le segundo paso no es necesario llegar a
la ltima posicin del vector ya que en el se encuentra el mayor valor, en el tercer
paso los dos ltimos valores ya estn ordenados. Y as sucesivamente. Por lo cual
en esta ordenacin hay un mximo de cambios igual:
(n 1) + (n 2) + (n 3) +... + 3 + 2 + 1 = n * (n 1) / 2 intercambios de elementos.
Para optimizar este algoritmo su pseudocdigo deber ser el siguiente.
Pseudocdigo algoritmo burbuja 2.

INICIO
para I 1 hasta N 1 hacer
para J 1 hasta N I hacer
si X(J) > X(J + 1) entonces {intercambiar}
AUX X(J)
X(J) X(J + 1)
X(J+ 1) AUX
fin si
fin para
fin para
Como se puede notar el nico cambio que sufri el pseudocdigo es N-I en lugar de
N-1 en el segundo para, este cambio no alterar el diseo del diagrama N-S por lo
cual
no
lo
repetiremos.
Segunda mejora
Esta segunda mejora toma el caso cuando aun no cumplidos todos los ciclos el
vector ya se encuentra ordenado. En este caso es posible que estemos realizando
ciclos innecesarios, los que consumen tiempo de procesador sin beneficio. Para
evitar este problema lo que se har es colocar una bandea. Su funcin es que
cuando en un ciclo no se haga ningn cambio (lo que implica que el vector ya esta
ordenado), la bandera indique esto y se detenga el proceso. Pseudocdigo
algoritmoburbuja3
lNlClO
Bandera F (falso)
I1
mientra Bandera = F y I < N hacer
Bandera V (verdadero)
para J 1 hasta N I hacer
si X(J) > X(J + 1) entonces {intercambiar}
AUX X(J)
X(J) X(J + 1)
X(J+ 1) AUX
Bandera F
fin si
Incrementa I
fin para
fin para
El diagrama N-S del algoritmo de burbuja3:
Bandera F (falso) I 1
Bandera = F y I < N
Bandera V (verdadero)
J 1 hasta N I
X(J) > X(J + 1) {intercambiar}

AUX X(J)
X(J) X(J + 1)
X(J+ 1) AUX
Incremente I
Cdigo en Pascal del procedimiento para el algoritmo de burbuja3:
programa Ordenamiento Burbuja;
{* Ejemplo del ordenamiento por el mtodo de burbujeo *}
{* Burbujeo mejorado con bandera *}
{* Archivo BurbujaB.Pas *}
{* Desarrollo del Ing. Fernando J. LAGE *}
{* Octubre 1998*}
uses
wincrt,windos; {* declaraciones de librerias, para correr bajo Windows *}
{* crt,dos;*} {* declaraciones de librerias, para correr bajo DOS *}
const
Enter = #13;
Ln = #13#10;
type {* Definicin de tipos *}
Nmeros = 1..3200;
Vector = array[1..256]of Nmeros;
Var
Dato : Vector;
Filas : Byte;
proceder Intercambio E (var Capa, Omega : Nmeros);
{* Intercambio E produce el intercambio de dos valores del vector *}
var
Aux : Nmeros; {* elemento auxiliar *}
Begin {* Comienzo del procedimiento Intercambio E *}
Aux := Capa;
Capa := Omega;
Omega := Aux
End; {* Fin del procedimiento Intercambio E*}
proceder BurbujaB (var Alfa: Vector; Elementos: integer);
{* BurbujaB produce el ordenamiento usando el mtodo de la burbuja *}
{* Optimizado por el uso de una Bandera *}
var
Bandera : Boolean;
Iteracion, Contador : Integer; {* Iteracion reemplaza I del pseudocdigo *}
{* Contador a J del pseudocdigo *}
Begin {* Comienzo del procedimiento BurbujaB *}
Bandera := False;
Iteracion := 1;
While (Bandera = False) and (Iteracion < Elementos) do
Begin
Bandera := True;
For Contador := 1 to Elementos - Iteracion do
If Alfa[Contador] > Alfa[Contador + 1] then
Begin

Intercanbio (Alfa[Contador],Alfa[Contador + 1]);


Bandera := False
End; {* Fin del If*}
Inc(Iteracin)
End {* Fin del While*}
End; {* Fin del procedimiento BurbujaB*}
Begin {* Comienzo del programa *}
{* Se limpia la pantalla *}
ClrScr;
........................
{* Llamado al procedimientos BurbujaB *}
BurbujaB (Dato, Filas);
........................
end. {* Fin del programa *}
MTODO POR INSERCIN
Este mtodo consiste en insertar un elemento en el vector en una parte ya ordenada
de este vector y comenzar de nuevo con los elementos restantes. Por ser utilizado
generalmente por los jugadores de cartas se le conoce tambin por el nombre de
mtodo de la baraja. Este mtodo, para usarlo en forma ptima, debe aplicarse a
medida que se carga el vector. As, por ejemplo, supongamos el caso del ejemplo
anterior.
Insercin mientras se carga el vector
Nmero de paso
Ing. 64 28 13 23 79 54 25 18 11
V(1) 64 28 13 13 13 13 13 13 11
V(2) 64 28 23 23 23 23 18 13
V(3) 64 28 28 28 25 23 18
V(4) 64 64 54 28 25 23
V(5) 79 64 54 28 25
V(6) 79 64 54 28
V(7) 79 64 54
V(8) 79 64
V(9) 79
Cuando ingresa el primer valor (64) se lo debe colocar en la primera posicin.
Cuando ingrese el segundo (28), se lo comparar con el primero y si es menor se
desplaza el primero a la segunda posicin y se coloca el segundo en dicho lugar.
Caso
contrario
se
agrega
detrs
del
ltimo.
Cuando ingrese el tercero se chequera con el segundo si es menor el segundo se
chequea contra el primero y si es menor que este se desplaza una posicin hacia
abajo el segundo y el tercero, y se coloca en primer lugar el dato. Si hubiera sido
mayor que el primero solo se desplaza el segundo y se hubiera colocado ah, sino
simplemente se hubiera colocado en la tercera posicin.
Este
proceso
se
repite
con
cada
elemento
del
vector.
Otra forma de implementar lo mismo, es compara el valor con cada elemento del

vector desde el ltimo hasta encontrar uno menor y en cada caso que es mayor (el
elemento del vector) desplazar una posicin hacia abajo.
Aqu vamos a desarrollar, pseudocdigo, diagrama N-S y cdigo Pascal para este
ltimo caso.
Pseudocdigo algoritmo insercin1
para I 1 hasta N hacer
Leo Dato
JI-1
Mientras Auxiliar < X(J) o J >0 hacer
X(J+1) X(J)
JJ-1
fin mientras
X(J+1) Auxiliar
fin para
fin
El diagrama N-S del algoritmo de insercin1:
I 1 hasta N
Auxiliar Dato
JI-1
Auxiliar < X(J) o J > 0
X(J+ 1) Auxiliar
JJ-1
X(J+1) Auxiliar
El cdigo Pascal que pasmos a desarrollar para este caso se divide en un programa
principal donde se lee y escribe el vector, y procedimiento donde se ordena el vector
a medida que ingresan los datos.
Cdigo Pascal del algoritmo de Imsercin1:
program Ordenamiento_Insercion;
{* Ejemplo del ordenamiento por el mtodo de Insercin *}
{* Insercin mejorado con bandera y trabaja mientras carga el vector*}
{* Archivo Insercio.Pas *}
{* Desarrollo del Ing. Fernando J. LAGE *}
{* Octubre 1998*}
uses
wincrt,windos; {* declaraciones de librerias, para correr bajo Windows *}
{* crt,dos;*} {* declaraciones de librerias, para correr bajo DOS *}
const
Enter = #13;
Ln = #13#10;
type {* Tipo conjunto *}
Nmeros = 1..3200;
Vector = array[1..5]of Nmeros;
Var

Dato : Vector;
I, J : Byte;
Valor : Nmeros;
procedure Insercin (var Alfa: Vector; Val: Nmeros; Elemento: Byte);
{* Insercin produce el ordenamiento usando el mtodo de insercin *}
{* El cual utiliza una Bandera *}
{* Alfa es el vector que contienen los datos *}
{* Val es el dato y Elemento la cantidad de valores cargados *}
var
Iteracion : Integer; {* Iteracion reemplaza al J del pseudocdigo *}
Begin {* Comienzo del procedimiento Insercin *}
Iteracion := Elemento - 1;
While (Val < Alfa[Iteracion]) and (Iteracion > 0) do
Begin
Alfa [Iteracion+1]:= Alfa [Iteracion];
Dec (Iteracion);
End; {* Fin del While *}
Alfa[Iteracion + 1] := Val;
End; {* Fin del procedimiento Insercin *}
Begin {* Comienzo del programa *}
{* El programa solo juega con 5 valores porque es demostrativo *}
{* Se limpia la pantalla *}
ClrScr;
For I := 1 to 5 do
Begin
{* Carga del dato *}
Write ('Dato(',I:1,')= ');
ReadLn (Valor);
{* Llamado al procedimientos Insercin *}
Insercin( Dato, Valor, I);
end;
{* Listado del dato *}
For J := 1 to 5 do
WriteLn ('Dato(',J:2,')= ',Dato[J]);
end. {* Fin del programa *}
Insercin en un vector ya almacenado
Supongamos que el vector se encuentra ya almacenado y lo queremos ordenas. En
este caso comenzamos enviando a una variable auxiliar el segundo elemento del
vector (28), Luego se compara esta variable con el primer valor, si es menor se
desplaza el primer valor una posicin hacia abajo y se coloca en el primer lugar el
contenido de la variable auxiliar, caso contrario el contenido de la variable auxiliar se
coloca
en
la
segunda
posicin.
Luego se toma el tercer valor del vector (13) y se lo pasa a la variable y se lo
compara con el segundo valor del vector si es menor el segundo valor se copia en la
tercera posicin y se compara la variable con primer valor (aqu nos encontramos en
el caso anterior), caso contrario copiamos el valor auxiliar en la tercera posicin.

As sucesivamente hasta que llegamos a la ltima posicin del vector. Debe tenerse
en cuenta que cuando estamos trabajando con el elemento n del vector, los n-1
elementos anteriores ya han sido ordenados, lo que implica que hasta la posicin n-1
el vector est ordenado, y es en dicho rango donde realizaremos la bsqueda de la
nueva posicin del dato por lo cual para optimizar dicha bsqueda se podr realizar
por el mtodo de Bsqueda Binaria, lo que aumentar la eficiencia. El desarrollo con
Bsqueda Binaria se ver ms adelante.
Nmero de paso
Ing. 1 2 3 4 5 6 7 8
V(1) 64 28 13 13 13 13 13 13 11
V(2) 28 64 28 23 23 23 23 18 13
V(3) 13 13 64 28 28 28 25 23 18
V(4) 23 23 23 64 64 54 28 25 23
V(5) 79 79 79 79 79 64 54 28 25
V(6) 54 54 54 54 54 79 64 54 28
V(7) 25 25 25 25 25 25 79 64 54
V(8) 18 18 18 18 18 18 18 79 64
V(9) 11 11 11 11 11 11 11 11 79
El algoritmo de insercin propiamente dicho no sufre modificaciones lo nico que se
debe modificar es el programa principal donde se lee y escribe el vector, y
procedimiento donde se ordena el vector a medida que ingresan los datos.
Cdigo Pascal del algoritmo de llamado insercin1:
Begin {* Comienzo del programa *}
{* El programa solo juega con 5 valores porque es demostrativo *}
{* Se limpia la pantalla *}
ClrScr;
For I := 1 to 5 do
Begin
{* Carga del dato *}
Write ('Dato(',I:1,')= ');
ReadLn (Valor);
end;
For I := 2 to 5 do
Begin
{* Carga del dato *}
Valor := Dato [I];
{* Llamado al procedimientos Insercin *}
Insercin( Dato, Valor, I);
end;
{* Listado del dato *}
For J := 1 to 5 do
WriteLn ('Dato(',J:2,')= ',Dato[J]);
end. {* Fin del programa *}
El algoritmo de insercin se mejora notablemente aplicando el mtodo de bsqueda
binaria para encontrar el lugar de insercin.
Este mtodo tiene un nmero de comparaciones igual a:

ORDENACIN POR SELECCIN


Este mtodo se basa en buscar el elemento menor del vector y colocarlo en primera
posicin. Luego se busca el mayor que se encuentra entre el segundo elemento y el
ltimo, y se coloca en la segunda posicin, y as sucesivamente. Los pasos
sucesivos a dar son:
1. Seleccionar el elemento menor del vector de n elementos.
2. Intercambiar dicho elemento con el primero.
3. Repetir estas operaciones con los n l elementos restantes, seleccionando
el segundo elemento; luego continuamos con los n 2 elementos restantes
hasta que slo quede el mayor.
Aplicaremos en el ejemplo anterior el mtodo para poder aclararlo.
Nmero de paso
Ing. 1 2 3 4 5 6 7 8
V(1) 64 11 11 11 11 11 11 11 11
V(2) 28 28 13 13 13 13 13 13 13
V(3) 13 13 28 18 18 18 18 18 18
V(4) 23 23 23 23 23 23 23 23 23
V(5) 79 79 79 79 79 25 25 25 25
V(6) 54 54 54 54 54 54 28 28 28
V(7) 25 25 25 25 25 79 79 54 54
V(8) 18 18 18 28 28 28 54 79 64
V(9) 11 64 64 64 64 64 64 64 79
1. Entre las posiciones V(1) y V(9) el menor valor se halla en V(9) y es el
nmero 11 este valor lo intercambio con V(1)
2. Entre las posiciones V(2) y V(9) el menor valor se halla en V(3) y es el
nmero 13 este valor lo intercambio con V(2)
3. Entre las posiciones V(3) y V(9) el menor valor se halla en V(8) y es el
nmero 18 este valor lo intercambio con V(3)
4. Y as sucesivamente hasta llegar a buscar entre V(8) y V(9) (entre V(n-1) y
V(n). Que ser el ltimo caso.
Ahora vamos a desarrollar, pseudocdigo, diagrama N-S y cdigo Pascal para
este algoritmo.
Pseudocdigo algoritmo seleccin
para I 1 hasta N - 1 hacer
Aux V(I)
KI
para J J+1 hasta N hacer
si V(J) < Aux entonces
Aux V(J)
KJ
fin_si
fin_para
V(K) V(I)
V(I) Aux

fin_para
El diagrama N-S del algoritmo de seleccin:
I 1 hasta N - 1
Aux V(I)
KI
J J+1 hasta N
V(J) < Aux
Aux V(J)
KJ

V(K) V(I)
V(I) Aux
Cdigo Pascal del algoritmo del procedimiento de seleccin
procedure Seleccin (var Alfa: Vector; Elemento: Byte);
{* Seleccin produce el ordenamiento usando el mtodo del mismo nombre *}
{* Alfa es el vector que contienen los datos *}
{* Elemento la cantidad de valores cargados *}
var
I, J, K : Integer;
Aux: Nmeros;
Begin {* Comienzo del procedimiento Seleccin *}
For I := 1 To Elemento 1 do
Begin
Aux := Alfa[I];
K := I;
For J := I + 1 To Elemento do
If Alfa [J] < Aux then
Begin
Aux := Alfa [J];
K := J;
End; {* Fin del If y del For J *}
Alfa[K] := Alfa[I];
Alfa[I] := Aux;
End; {* Fin del For I *}
End; {* Fin del procedimiento Seleccin *}
Mtodo de Shell
Es una mejora del mtodo de insercin directa que se utiliza cuando el nmero de
elementos a ordenar es grande. El mtodo se denomina "Shell" en honor de su
creador
Donald
Shell.
El mtodo Shell se basa en fijar el tamao de los saltos constantes, pero de ms de
una
posicin.
Supongamos un vector de elementos de n posiciones, en lugar de compara la
primera con la segunda. la segunda con la tercera y as sucesivamente hasta

comparar la n-1 posicin con la posicin n. Define una apertura igual a la mitad de n
(entera), y compara la primera posicin con la (N/2)+1, la segunda con la (N/2)+2 y
as sucesivamente hasta llegar (N/2)-1 con N. Con la misma apertura se repite el
proceso hasta que en una vuelta no existan ms cambios. Aqu es cuando se reduce
la apertura a la mitad (entero) y se repite el proceso de las comparaciones, hasta
que no se produzcan cambios. En esta situacin se reduce el salto a la mitad. Y esto
se hace as sucesivamente hasta que con salto uno en una vuelta no haya ms
cambios.
Aplicaremos en el ejemplo anterior el mtodo de Shell
Nmero de paso
Ape 4 4 4 2 2 2 1 1
V(1) 64 64 11 11 11 11 11 11 11
V(2) 28 28 28 28 18 18 18 13 13
V(3) 13 13 13 13 13 13 13 18 18
V(4) 23 18 18 18 28 23 23 23 23
V(5) 79 11 64 64 25 25 25 25 25
V(6) 54 54 54 54 23 28 28 28 28
V(7) 25 25 25 25 64 64 64 54 54
V(8) 18 23 23 23 54 54 54 64 64
V(9) 11 79 79 79 79 79 79 79 79
El algoritmo resultante expresado con la estructura iterar ser:
Pseudocdigo algoritmo Shell
inicio
E N+1
repetir
E ent(E/2)
repetir
Salida Verdadero
Para I 1 hasta N E hacer
si X(I)> X(I+ E)
entonces
AUX X(I)
X(I) X(I+ E)
X(I + E) AUX
SW Falso
fin_si (fin para)
hasta Salida = Verdadero
hasta E= 1
fin
El diagrama N-S del algoritmo de Shell:
EN+1
E entero (E/2)
Salida Verdadero
I 1 hasta N - E
X(I) < X(I+E)
Aux X(I)

X(I) X(I+E)
X(I+E) Aux

Salida = Verdadero
E=1
Cdigo Pascal del algoritmo del procedimiento Shell
procedure Shell (var Alfa: Vector; N: Byte);
{* Insercin produce el ordenamiento usando el mtodo de insercin *}
{* Alfa es el vector que contienen los datos *}
{* N es la cantidad de valores cargados *}
var
Salida : Boolean;
Aux : Nmeros;
E, I : Byte;
Begin {* Comienzo del procedimiento Shell *}
E := N + 1;
Ripear
E := E div 2;
Repeat
Salida := True;
For I := 1 To (N-E) Do
If Alfa[I] > Alfa[I+E] Then
Begin
Aux := Alfa [I];
Alfa[I] := Alfa[I+E];
Alfa[I+E]:= Aux;
Salida := False
End
Until Salida
Until E= 1
End; {* Fin del procedimiento Shell*}
Mtodo de ordenacin rpida ("quicksort")
El mtodo de ordenacin rpida (quicksort) para ordenar o clasificar un vector o lista
de elementos (array), se basa en el hecho de que es ms rpido y fcil de ordenar
dos listas pequeas que una lista grande. Se denomina mtodo de ordenacin
rpida
y
es
debido
Hoare.
El mtodo se basa en la estrategia tpica de "divide y vencers. La lista a clasificar
almacenada en un vector o array se divide en dos: una que contiene los valores
menores o iguales a un cierto valor especfico y otra con todos los valores mayores
que ese valor. El valor elegido puede ser cualquier valor arbitrario del vector y se
denomina valor pivote.
El primer paso es dividir la lista original en dos sablistas o subvectores y un valor de
separacin.

As, el vector V se divide en tres partes:


- Subvector VI que contiene los valores inferiores o iguales.
- El elemento de separacin.
- Subvector VD que contiene los valores superior o iguales.
Los subvectores VI y VD no estn ordenados, excepto en el caso de reducirse a un
elemento.
Consideremos la lista de valores.
18 11 27 13 9 4 16
Se elige un pivote, 13. Se recoge la lista desde el extreme izquierdo y se busca un
elemento mayor que 13 (se encuentra el 18). A continuacin, se busca desde el
extremo derecho un valor menor que 13 (se encuentra el 4).
18 11 27 13 9 4 16
Se intercambian estos dos valores y se produce la lista
4 11 27 13 9 18 16
Se sigue recorriendo el vector por la izquierda y se localiza el 27, y a continuacin
otro valor bajo se encuentra a la derecha (el 9). Intercambiar estos dos valores y se
obtiene
4 11 9 13 27 18 16

ESTRUCTURAS DE DATOS NO LINEALES (ARBOLES Y GRAFOS)


1.- Arboles Definicin
UN rbol es Uma structures de datos ampliamente usada que emula la forma de
un rbol (un conjunto de nodos conectados). Un nodo es la unidad sobre la que se
construye el rbol y puede tener cero o mas nodos hijos conectados a l. Se dice
que un nodo a es padre de un nodo b, si existe un enlace desde a hasta b (en ese
caso, tambin decimos que b es hijo de a). Slo puede haber un nico nodo sin
padres, que llamaremos raz. Un nodo que no tiene hijos se conoce como hoja.
El rbol Tambin se define como una estructura de datos no lineal. Esta estructura
se usa principalmente para representar datos con una relacin jerrquica entre sus
elementos, como por ejemplo registros, rboles genealgicos y tablas de
contenidos. Entre otros tenemos un tipo especial de de rbol que es, llamado rbol
binario, que puede ser implementado fcilmente en la computadora.

1.1. - Representacin en Memoria de Arboles

Las operaciones comunes en rboles son:


Enumerar todos los elementos.
Buscar un elemento
Dado un nodo, listar los hijos (si los hay). Borrar un elemento.
Dado un nodo, listar los hijos (si los hay). Borrar un elemento.
Eliminar un subrbol (algunas veces llamada podar). Aadir un subrbol
(algunas veces llamada injertar).
Encontrar la raz de cualquier nodo.

A_1, A_2 \dots n_1, n_2, \dots, n_k


N_1, N_2, \dots,N_k
N = 1 + N_1 + \dots + N_k n_1, n_2, \dots, n_k

A_1, A_2 \dots A_k A_2 \dots A_k


A_1, A_2 \dots A_k
Por su parte, la representacin puede realizarse de diferentes formas. Las ms
utilizadas son:
Representar cada nodo como una variable en el heap, con punteros a sus
hijos y a su padre.
Representar el rbol con un array donde cada elemento es un nodo y las
relaciones padre-hijo vienen dadas por la posicin del nodo en el array.

1.2. - ARBOLES GENERALES


Formalmente, podemos definir un rbol de la siguiente forma:
Caso base: un rbol con slo un nodo (es a la vez raz del rbol y hoja).
Un nuevo rbol a partir de un nodo nr y k rboles
de races
n1, n2,..nk conN1, N2,.Nk elementos cada uno, puede construirse
estableciendo una relacin padre-hijo entre nr y cada una de las races de los
k rboles. El rbol resultante N=1+N1+.Nk de nodos tiene como raz
el nodo nr, los nodos son los hijos de nr y el conjunto de nodos hoja est
formado por la unin de los k conjuntos hojas inciales. A cada uno de los
rboles Ai se les denota ahora subrboles de la raz.
Una sucesin de nodos del rbol, de forma que entre cada dos nodos consecutivos
de la sucesin haya una relacin de parentesco, decimos que es un recorrido rbol.
Existen dos recorridos tpicos para listar los nodos de un rbol: primero en
profundidad y primero en anchura. En el primer caso, se listan los nodos
expandiendo el hijo actual de cada nodo hasta llegar a una hoja, donde se vuelve al
nodo anterior probando por el siguiente hijo y as sucesivamente. En el segundo,
por su parte, antes de listar los nodos de nivel n + 1 (a distancia n + 1 aristas de la
raz), se deben haber listado todos los de nivel n. Otros recorridos tpicos del rbol
son preorden, postorden e inorden:
El recorrido en preorden, tambin llamado orden previo consiste en
recorrer en primer lugar la raz y luego cada uno de los hijos en orden
previo.
El recorrido en inorden, tambin llamado orden simtrico (aunque este
nombre slo cobra significado en los rboles binarios) consiste en
recorrer en primer lugar A1, luego la raz y luego cada uno de los hijos
en orden simtrico.
El recorrido en postorden, tambin llamado orden posterior consiste en
recorrer en primer lugar cada uno de los hijos en orden posterior y por
ltimo la raz.
Finalmente, puede decirse que esta estructura es una representacin del concepto
de rbol en teora de grafos. Un rbol es un grafo conexo y acclico 180pxBinary_tree_%28oriented_digraph%29.png

1.3. - ARBOLES BINARIOS


En ciencias de la computacin, un rbol binario es una estructura de datos en la
cual cada nodo siempre tiene un hijo izquierdo y un hijo derecho. No pueden tener
ms de dos hijos (de ah el nombre "binario"). Si algn hijo tiene como referencia a
null, es decir que no almacena ningn dato, entonces este es llamado un nodo
externo. En el caso contrario el hijo es llamado un nodo interno. Usos comunes de
los rboles binarios son los rboles binarios de bsqueda, los montculos binarios y
Codificacin de Huffman.

1.5. - RECORRIDOS EN RBOL BINARIO PRE ORDEN


En este tipo de recorrido se realiza cierta accin (quizs simplemente imprimir por
pantalla el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se
trata el subrbol izquierdo y cuando se haya concluido, el subrbol derecho. En el
rbol de la figura el recorrido en preorden sera: 2, 7, 2, 6, 5, 11, 5, 9 y 4.
Void pre orden (t rbol *a)
{
If (a! = NULL) {
Tratar (a); //Realiza
preorden(a->hDerecho);

una

operacin

en

nodo preorden(a->hIzquierdo);

}
}
Implementacin en pseudocdigo de forma iterativa:
Push(s, NULL); //insertamos en una pila (stack) el valor NULL, para asegurarnos de
que est vaca push(s, raz); //insertamos el nodo raz
MIENTRAS (s <> NULL) HACER
p = pop(s); //sacamos un elemento de la pila

Tratar (p); //realizamos operaciones sobre el nodo p


SI (I (p) <> NULL) //preguntamos si p tiene rbol derecho ENTONCES push(s,D (p));
FIN-SI
180px-Binary_tree_%28oriented_digraph%29.png
SI (D (p) <> NULL) //preguntamos si p tiene rbol izquierdo ENTONCES push(s,I(p));

FIN-SI
FIN-MIENTRAS
1.6. - RECORRIDOS EN RBOL BINARIO POS ORDEN
En este caso se trata primero el subrbol izquierdo, despus el derecho y por ltimo
el nodo actual. En el rbol de la figura el recorrido en post orden sera: 2, 5, 11, 6, 7,
4, 9, 5 y 2.
Void post orden (t Arbor *a)
{
if (a != NULL) {
Post orden (a->hIzquiedo);
Post orden (a->hDerecho);
Tratar (a); //Realiza una operacin en nodo
}
}
1.7. - BALANCEO ARBOLES BINARIOS
rbol AVL es un tipo especial de rbol binario ideado por los matemticos rusos
Adelson-Velskii y Landis. Fue el primer rbol de bsqueda binario auto- balanceable
que se ide. El rbol AVL toma su nombre de las iniciales de los apellidos de sus
inventores, Adelson-Velskii y Landis. Lo dieron a conocer en la publicacin de un
artculo en 1962: "An algorithm for the organization of information" ("Un algoritmo
para la organizacin de la informacin").
Los rboles AVL estn siempre equilibrados de tal modo que para todos los nodos,
la altura de la rama izquierda no difiere en ms de una unidad de la altura de la
rama derecha. Gracias a esta forma de equilibrio (o balanceo), la complejidad de
una bsqueda en uno de estos rboles se mantiene siempre en orden de
complejidad O (log n). El factor de equilibrio puede ser almacenado directamente en
cada nodo o ser computado a partir de las alturas de los subrboles.
Para conseguir esta propiedad de equilibrio, la insercin y el borrado de los nodos

se ha de realizar de una forma especial. Si al realizar una operacin de insercin o


borrado se rompe la condicin de equilibrio, hay que realizar una serie de
rotaciones de los nodos.
Los rboles AVL ms profundos son los rboles de Fibonacci.

1.8. - CLASES PARA IMPLEMENTACIN ARBOLES


Los rboles binarios pueden ser construidos a partir de lenguajes de programacin
de varias formas. En un lenguaje con registros y referencias, los rboles binarios
son construidos tpicamente con una estructura de nodos y punteros en la cual se
almacenan datos, cada uno de estos nodos tiene una referencia o puntero a un
nodo izquierdo y a un nodo derecho denominados hijos. En ocasiones, tambin
contiene un puntero a un nico nodo. Si un nodo tiene menos de dos hijos, algunos
de los punteros de los hijos pueden ser definidos como nulos para indicar que no
dispone de dicho nodo. En la figura adjunta se puede observar la estructura de
dicha implementacin.

Los rboles binarios tambin pueden ser almacenados como una estructura de datos
implcita en arreglos, y si el rbol es un rbol binario completo, este mtodo no
desaprovecha el espacio en memoria. Tomaremos como notacin la siguiente: si un
nodo tiene un ndice i, sus hijos seencuentran en ndices 2i + 1 y 2i + 2, mientras que
sus padres (si los tiene) se encuentra en el ndice(partiendo de que la raz tenga
ndice cero). Este mtodo tiene como ventajas el tener almacenados los datos de
forma ms compacta y por tener una forma ms rpida y eficiente de localizar los
datos en particular durante un preoden transversal. Sin embargo, desperdicia mucho
espacio en memoria.

1.9. - GRAFOS DEFINICIN


Los grafos son artefactos matemticos que permiten expresar de una forma
visualmente muy sencilla y efectiva las relaciones que se dan entre elementos de
muy diversa ndole. Un grafo simple est formado por dos conjuntos:
stella.gif
Un conjunto V de puntos llamados vrtices o nodos.

Un conjunto de pares de vrtices que se llaman aristas o arcos y que indican qu


nodos estn relacionados. De una manera ms informal podemos decir que un grafo
es un conjunto de nodos con
enlaces entre ellos, denominados
aristas o arcos.
Las aplicaciones ms importantes
de los grafos son las siguientes:
Rutas
ciudades.
Determinar tiempos mximos y mnimos en un proceso.
Flujo y control en un programa.
Operaciones Sobre Grafos:
Las operaciones sobre grafos, como:

entre

Creacin.
Insercin.
Bsqueda.
Eliminacin.

1.10. - TIPOS DE GRAFOS


Existen dos tipos de grafos los no dirigidos y los dirigidos.
No dirigidos: son aquellos en los cuales los lados no estn orientados (No son
flechas). Cada lado se representa entre parntesis, separando sus vrtices por
comas, y teniendo en cuenta (Vi,Vj)=(Vj,Vi).

Dirigidos: son aquellos en los cuales los lados estn orientados (flechas).
Cada lado se representa entre ngulos, separando sus vrtices por comas y
teniendo en cuenta <Vi,Vj>!=<Vj ,Vi>. En grafos dirigidos, para cada lado <A,
B>, A, el cual es el vrtice origen, se conoce como la cola del lado y B, el cual
es el vrtice destino, se conoce como cabeza del lado.

1.11. - REPRESENTACIN DE GRAFOS EN MEMORIA


Recorrido de un grafo: Recorrer un grafo significa tratar de alcanzar todos los
nodos que estn relacionados con uno que llamaremos nodo de salida.
Existen bsicamente dos tcnicas para recorrer un grafo: el recorrido en
anchura; y el recorrido en profundidad.
Recorrido en anchura: El recorrido en anchura supone recorrer el grafo, a
partir de un nodo dado, en niveles, es decir, primero los que estn a una
distancia de un arco del nodo de salida, despus los que estn a dos arcos de
distancia, y as sucesivamente hasta alcanzar todos los nodos a los que se
pudiese llegar desde el nodo salida.
Recorrido en profundidad: el recorrido en profundidad trata de buscar los
caminos que parten desde el nodo de salida hasta que ya no es posible
avanzar ms. Cuando ya no puede avanzarse ms sobre el camino elegido,

se vuelve atrs en busca de caminos alternativos, que no se estudiaron


previamente.

1.12. - CLASES PARA IMPLEMENTACIN DE GRAFOS


CIRCUITO DE HAMILTON
En un grafo se tiene un circuito de Hamilton cuando se inicie en un nodo y termina en
el mismo pasando exactamente una vez por cada nodo.

CIRCUITO DE VENN EULER


Este circuito se da en grafos donde se realiza un camino donde se puede pasar solo
una vez por cada arco.
El factor de peso o Ponderacin se da en un grafo en el cual hay datos asociados con
un arco.